在mongoose save中没有调用异步瀑布回调

时间:2014-09-22 05:06:40

标签: node.js mongodb asynchronous express mongoose

我正在使用express,mongoose和async。

在控制器的更新方法中,我正在调用以下内容:

//note: we're within a constructor's prototype method, hence the 'self'. also body is simply the request body.

    async.waterfall([
        function(callback) {
            self.collection.findById(body._id).exec(function(err, item) {
                if(item) {
                    callback(null, item);
                } else {
                    callback(err);
                }
            });
        },
        function(item, callback) {
            //callback(null, item); //makes this task work, but not what I need

            //merge two together models together, then save
            item.save( _.extend(item, body), function(err, item) {
                console.log('code here never seems to get called within the waterfall');
                callback(null, item);
            });
        }
    ], function(err, results) {
        console.log('hello', err, results);
        self.res.json(results);
    });

所以基本上我要做的就是通过id找到一个文档,然后将新对象合并到我刚找到的文件中,保存它,并将结果作为JSON返回。但嵌套在.save中的回调函数似乎永远不会被调用。所以整个请求似乎都挂了,瀑布中的最终函数永远不会被调用。

我可能错了,但似乎是异步调用save方法的回调。我将如何让这个工作?

旁注:如果save方法的回调是异步的,那么为什么这似乎有效呢?

    var _this = this;
    var item = new this.collection(this.req.body);
    item.save(function(err, data) {
        _this.res.json(data);
    });

该方法将保存的对象作为JSON返回就好了。

1 个答案:

答案 0 :(得分:2)

您没有正确使用Model.save方法。它只需要一个回调作为第一个参数。您必须提取item个实例,然后在item个实例上设置新的属性值,然后执行item.save(callback);