NodeJS:从异步函数返回数据

NodeJS: Returning data from an async function

我正在尝试编写一个函数来在我的数据库 (mongodb) 上创建一个新用户,然后 return 该用户作为我定义的对象。但是,由于插入用户的调用是异步的,因此 result.nInserted 始终未定义,因为异步代码未及时完成。因此,我永远不会 return 我的用户。我会在插入完成后尝试使用回调来获取用户,但是我如何才能 return 从我的原始 addUser 函数中获取数据?

User.addUser = function(db, email, username, password, firstname, lastname, company, twitter){
    var _id = new mongodb.ObjectID();

    var result = db.get('users').insert({
        _id: _id,
        email : email,
        verified : false,
        password : password,
        username : username,
        firstname : firstname,
        lastname : lastname,
        company : company,
        twitter : twitter,
        rank : config.RANK_USER
    });

    return result.nInserted == 1 ? new User(_id, email, false, username, firstname, lastname, company, twitter, config.RANK_USER) : false;
};

你必须在这里使用承诺模式:

return result.then(function( myNewUser ){
   return new User(myNewUser._id, email, false, username, firstname, lastname, company, twitter, config.RANK_USER);
})

来自文档:

Insert

Records can be inserted to a collection with insert

collection.insert(docs[[, options], callback])

所以你想要的可以通过回调函数完成。

我认为你可以解决你的任务

User.addUser = function(db, email, username, password, firstname, lastname, company, twitter, callback){
var _id = new mongodb.ObjectID();

db.get('users').insert({
    _id: _id,
    email : email,
    verified : false,
    password : password,
    username : username,
    firstname : firstname,
    lastname : lastname,
    company : company,
    twitter : twitter,
    rank : config.RANK_USER
}, callback);
};

所以回调函数会在插入完成时调用。

它接收两个参数:错误和结果。

function callback(err, res){
  // some actions
}

阅读这篇文章question,它会有所帮助!