这是我的架构/模型:
var todoSchema = new mongoose.Schema({
item: [String]
});
这是put方法
app.put('/todo/:id', urlencodedParser, function(req, res) {
Todo.findByIdAndUpdate(req.params.id,
{ "$push": { "item": req.body } },
{ "new": true, "upsert": true },
function (err, data) {
if (err) throw err;
console.log(data);
}
);
});
它应该发生的是它抓取id(:id),并找到ID,然后推送req.body(这是一个字符串,来自网页的输入)并将其推送到项目数组。
调用此put时,我收到以下错误:
CastError: Cast to ObjectId failed for value ":id" at path "_id" for model "Todo"
这很奇怪,因为当我使用findById()时,我没有明确地将id转换为ObjectId。
答案 0 :(得分:0)
代码是正确的。我认为可能是你的查询id不是一个有效的objectId,所以它转换错误..必须是12个字节的字符串..检查它?如果它的正确手段也检查mongoose版本,可能这也有问题。所以安装mongoose版本4
答案 1 :(得分:0)
Mongoose的_id默认类型是ObjectId。这就是你将_id传递给字符串值的原因。
Mongoose的findByIdAndUpdate方法将id参数强制转换为模型的_id字段的类型,以便它可以正确查询匹配的doc。这是一个ObjectId但是" req.params.id"不是有效的ObjectId,因此转换失败。
59b67565c8745e27f9f3cf46不会发生这种情况,因为该字符串是有效的ObjectId。
解决此问题的一种方法是在findByIdAndUpdate调用之前添加一个检查,以查看id是否是有效的ObjectId,如下所示:
if (req.params.id.match(/^[0-9a-fA-F]{24}$/)) {
// Yes, it's a valid ObjectId, proceed with `findById` call.
}
另一种方法是将字符串解析为ObjectId,如:
ObjectId.fromString( req.params.id )