如何从回调中获取值?(NodeJs+Mongoose)

How get values out of a callback? (NodeJs + Mongoose)

本文关键字:NodeJs+Mongoose 获取 回调      更新时间:2023-09-26

我不太擅长回调,现在我遇到了使用mongoose查找文档的问题,但在发送响应之前在同一操作/控制器中使用该文档。

uploadFile = function(req,res) {
    var _objs = {};
    function retrieveUser(objs,username, callback) {
        User.findOne({ 'username': username })
            .exec(function(err, user){
                if(err) callback(err,null,null);
                else callback(null,user,objs);
            });
    }//retrieveUser()
    retrieveUser(_objs,req.body.user,function(err,user,_objs) {
        if(err) console.log('ERROR: ' + err);
        _objs.user = user;
        console.log(_objs.user);
    });
    console.log(_objs);
}

因此,在回调函数中,console.log()正确地显示了对象,但第二个console.log()显示_objs为空。好吧,我需要用其他对象作为属性来填充_objs,我该如何实现呢?

一切都按设计进行。您的代码将执行如下:

retrieveUser(_objs,req.body.user,function(err,user,_objs) {
    // will be executed when the retrieveUser function completes is tasks...
    if(err) console.log('ERROR: ' + err);
    _objs.user = user;
    console.log(_objs.user);
});
// ...meanwhile, execution will continue here.
console.log(_objs); // depending on how fast retrieveUser calls the callback, _objs will be set or (more likely) not set.

您可以在回调中继续应用程序的控制流,也可以使用Streamline.js、async.js、Step、Seq、IcedOffeeScript、promise.js、…等框架

我就是这么做的。实际上,我所期望的是,这与我在其他语言的其他框架中的控制器中所做的类似,查询一些实体,并创建另一个与之前查询的实体相关的实体。

uploadPic = function(req, res, next) {
    var username = req.body.user,
        estId = req.body.est;
    async.series([
        function(callback) {
            User.findOne({ 'username': username})
                .exec(function(err, user){
                    if(err) return callback(err);
                    if(!user) return callback(new Error("No user whit username " + username + " found."));
                    callback(null,user);
                });
        },
        function(callback) {
            Est.findById(estId)
                .exec(function(err,est) {
                    if(err) return callback(err);
                    if(!est) return callback(new Error("No Est with ID " + estId + " found"));
                    callback(null,est);
                })
        },
    ],function(err,results){
        if(err) return next(err);
        console.log(results);
        /// do my own stuffs here!
    });// end async.series()
}