当我向子文档添加值时,在命令提示符中显示错误
像无法读取属性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
。
后
创建批处理我将获得id
。在id
的帮助下,我试图在当时向场地添加值,它向我显示了错误
batch.venue.push(req.body);
答案 0 :(得分:3)
您获得的错误意味着:
if (err) throw err;
没有触发batch.venue
未定义,因为您获得Cannot read property 'push' of undefined
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];
}
或类似的东西,即在尝试将元素推送到它之前需要检查是否有数组。如果你没有阵列,那么你将不得不创建一个新阵列。
答案 1 :(得分:1)
这也可以解决:
Batches.findById(req.params.batchId, function (err, batch) {
if (err) throw err;
const a = req.body.venue;
for(i=0;i<a.length;i++ )
{
batch.venue.push(req.body.venue[i]);
}
batch.save(function (err, batch) {
if (err) throw err;
console.log('Updated venue!');
res.json(batch);
});
});
答案 2 :(得分:0)
Router();
在此方法中,如果我们不提及(),也会显示推送错误...
const express = require('express');
const routerd = express.Router();
const Ninja = require('./models/ninja');
routerd.delete('/ninja:/id', function(req, res, next){
console.log(req.params.id);
res.send({type : 'DELETE'});
}).catch(next);
module.exports = routerd;
答案 3 :(得分:0)
如果我们未正确导入路由器,则会收到此错误。
示例代码段
const express = require('express')
const router = express.Router();
router.get("/signout", (req, res) =>{
res.send("user sign out")
})
module.exports = router;