无法阅读财产' _id'未定义使用猫鼬

时间:2014-05-30 02:08:34

标签: node.js mongoose

以下是我尝试运行的代码: -

        poolModel
        .find({})
        .exec(function (err, pools) {
            if(err)
                return next(new customError.Database(err.toString()));

            for(var i=0; i<pools.length; i++)
            {

                pools[i].views = 31;
                console.log(pools[i]._id);
                var pool_id = pools[i]._id;


                poolModel.findByIdAndUpdate(pool_id, pools[i], function(err, pool){
                   if(err)
                    console.log(err);
                   else
                    console.log(pool.views+'');

                });
               /* poolModel.findByIdAndUpdate(ObjectId(pools[i]._id), pools[i], function(err, pool){
                    if(err)
                        return next(new customError.Database(err.toString()));
                    console.log(pool.views);

                })*/
            }
        })

我的模型类中也有视图条目。 但我一直收到这个错误: - [TypeError:无法读取属性&#39; _id&#39;未定义的]

2 个答案:

答案 0 :(得分:1)

findByIdAndUpdate()是异步调用,将其置于常规for循环中将无法正常工作。它需要在异步循环中,其中一种方法是使用async.each()或async.eachSeries():

var async = require('async');

 :
 :

async.each(pools, function(item, callback) {
  var pool_id = item._id;
  item.views = 31;
  console.log(pool_id);
  poolModel.findByIdAndUpdate(pool_id, item, function(err, pool){
    if(err)
      console.log(err);
    else
      console.log(pool.views+'');
    callback(null);
  });
}, function(err) {
  console.log('all done');
});

答案 1 :(得分:1)

您不能将完整的Mongoose模型实例用作findByIdAndUpdate更新参数,而是通过将pools[i]传递给该方法而尝试执行的操作调用

相反,修改pools[i]后,请调用其save方法:

for(var i=0; i<pools.length; i++)
{
    pools[i].views = 31;
    pools[i].save(function(err, pool){
        if(err)
            console.log(err);
        else
            console.log(pool.views+'');
    }
}