如何解决不能读取nodejs应用程序中未定义的属性“推”?

当我将值添加到子文档时,在命令提示符中显示错误
像不能读取属性push 。 我该如何解决这个问题?

这是my schema code与这些帮助我赋予父架构的价值观
但我不能给这个子文档的值:

 var venueSchema = new Schema({ name: { type: String, required: true, unique:true }, address: { type: String, required: true } }, { timestamps: true }); // create a schema var batchSchema = new Schema({ batchname: { type: String, required: true, unique: true }, activityname: { type: String, required: true }, time: { type:String, required:true }, duration: { type:String, required:true }, classtype: { type:String, required:true }, trainer: { type:String, required:true }, price:{ type:Currency, required:true, unique:true }, venue:[venueSchema] }, { timestamps: true }); 

和我的Routing code

 batchRouter.route('/:batchId/venue') .post(function (req, res, next) { Batches.findById(req.params.batchId, function (err, batch) { if (err) throw err; batch.venue.push(req.body); batch.save(function (err, batch) { if (err) throw err; console.log('Updated venue!'); res.json(batch); }); }); }) 

这里的父文档是batchSchema ,子文档是venueSchema 。 后
创build批处理我将得到一个id 。 在这个id的帮助下,我试图给当时的场地增加价值,它显示了我的错误
batch.venue.push(req.body);

你得到的错误意味着:

  1. 你不会从数据库中得到一个错误,因为if (err) throw err; 不开火
  2. 您的batch.venue是未定义的,因为您Cannot read property 'push' of undefined
  3. 你的batch被定义,因为你没有得到Cannot read property 'venue' of undefined

这意味着你有一个与数据库的连接,你会得到一个你想要的ID的文件,但是它没有你期望出现的属性venue ,并且是一个数组。

代替:

 batch.venue.push(req.body); 

您可以使用:

 if (!Array.isArray(batch.venue)) { batch.venue = []; } batch.venue.push(req.body); 

要么:

 if (Array.isArray(batch.venue)) { batch.venue.push(req.body); } else { batch.venue = [req.body]; } 

或类似的东西,即你需要检查你是否有一个数组,然后再尝试将元素推送到它。 如果你没有一个数组,那么你将不得不创build一个新的。