【问题标题】:NodeJS: Returning data from an async functionNodeJS:从异步函数返回数据
【发布时间】:2015-04-21 19:59:09
【问题描述】:

我正在尝试编写一个函数来在我的数据库 (mongodb) 上创建一个新用户,然后将该用户作为我定义的对象返回。但是,由于插入用户的调用是异步的,因此 result.nInserted 始终未定义,因为异步代码没有及时完成。因此,我永远无法返回我的用户。插入完成后,我会尝试使用回调来获取用户,但是我如何能够从原始 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;
};

【问题讨论】:

    标签: javascript node.js mongodb asynchronous


    【解决方案1】:

    来自文档:

    插入

    可以使用 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,它会有所帮助!

    【讨论】:

    • 那么有没有办法让它像 User.addUser 传统上返回一个新的用户对象一样简单?我想这样做是因为它更整洁,更容易管理,但如果它不可行,那么我会尝试回调
    • 不,你不能return异步操作的结果(你可以 return任何你想要的,但结果显然不可用,所以你的选择是有限的)。最接近这一点的是使用Promise,但它不一样。或者,一旦 ECMA Sscript 6 得到完全支持,您就可以使用 generator 来执行此操作。
    【解决方案2】:

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

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

    【讨论】:

    • 这样做似乎仍然没有任何回报。我什至在 promise 回调中放置了一个 console.log,但没有记录任何内容。
    • 从头开始,我做了最愚蠢的事情,并在返回后放置日志。它似乎返回了正确的东西,但我位于var user = User.addUser(...); 的用户对象仍然未定义。这是否也需要一个承诺,比如var user = User.addUser(...).then(function(user){return user;});
    • 是的,您实际上是在处理 Promise 和异步模式,因此您必须使用回调。例如,根据您的用例,您可以通过回调解决用户请求。
    猜你喜欢
    • 2016-03-11
    • 2016-08-11
    • 2013-09-27
    • 2015-08-15
    • 2021-04-14
    • 2022-01-26
    • 2020-12-08
    • 2022-01-14
    • 2019-12-19
    相关资源
    最近更新 更多