为什么我不能使用此代码推送到Mongoose / Express中的数组?

时间:2017-09-16 05:00:53

标签: node.js mongodb express mongoose

这是我的架构/模型:

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。

2 个答案:

答案 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 )