【问题标题】:async.auto results object should have one value but has an array of twoasync.auto 结果对象应该有一个值,但有一个包含两个的数组
【发布时间】:2016-07-30 12:49:07
【问题描述】:

我正在尝试使用异步与 MongoDb 进行交互。出于某种原因,我的 async.auto 调用是将 2 个对象的数组添加到 results 参数中,而此时应该只有一个。

    async.auto({
        pantMeasurement: function (callback) {
            app.models.PantMeasurement.findOne({ temp_user_id: req.session.temp_user_id }, function (err, pantMeasurement) {
                var pantData = {'waist', 'length'};
                if (!pantMeasurement) {
                    return app.models.PantMeasurement.create(_.extend({ temp_user_id: req.session.temp_user_id }, pantData), callback);
                }
                _.extend(pantMeasurement, pantData);

                pantMeasurement.save(callback);
            });
        },
        user: ['pantMeasurement', function (callback, results) {
            var name = 'firstName';
            results.pantMeasurement.user_id = name;

            results.pantMeasurement.save(callback);  //ERROR HERE
        }]}, function(err, results) {
            ...
        }

在第二个任务user 中,results.pantMeasurement.save(callback); 行抛出save 不存在的错误。单步执行代码后,这是因为results 有一个包含两个pantMeasurement 对象的数组,而应该只有一个对象而没有数组。该数组由一个pantMeasurement 对象和一个空对象组成。

如果!pantMeasurement 为真并且在数据库中创建了一个新条目,则代码可以正常工作。但是无论何时调用pantMeasurement.save(callback),我都会看到这个错误,我不知道为什么。

【问题讨论】:

    标签: javascript node.js mongodb asynchronous mongoose


    【解决方案1】:

    您没有提到您使用哪个模块来访问 mongodb,但是当您使用模型时,我假设使用了 mongoose。如果我是对的,请将猫鼬标签添加到问题中。如果不是,请忽略此答案。

    Mongoose API documentation 声明 Model#save() 回调具有三个参数:

    function (err, document, numAffected) {
      //...
    }
    
    • err 是可选错误
    • document 是保存的文档
    • numAffected 如果文档在数据库中被更改,则为 1,如果不需要更改文档,则为 0(因为它是最新的)

    在您的调试屏幕截图中,您可以看到,数组中的第二个元素不是空对象,而是数字 0。这个数字是保存回调传递给异步结果的 numAffected-Parameter,所以这就是你得到一个数组的原因。

    为了简化您的代码,也许您应该考虑使用findOneAndUpdate() 语句,它可以让您一步找到并更新文档。它还接受一个 upsert 选项,如果没有,它将创建一个新文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-17
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多