【问题标题】:CastError: Cast to ObjectId failed for value ":id" at path "_id" for modelCastError:模型的路径“_id”处的值“:id”转换为 ObjectId 失败
【发布时间】:2021-07-04 11:59:05
【问题描述】:

前言:我对使用 mongoose/express 比较陌生。

我正在尝试制作一个应用程序,其中一个名为“Space”的猫鼬模式中有一个名为“posts”的数组。数组的内容是 ObjectId 对另一个名为“Post”的 mongoose Schema 的引用。但是,每次我向应该发回我的空间和其中的帖子的路线发出 GET 请求时,我都会收到一个令人讨厌的错误。另外,我的帖子没有填充我的空间。

错误:CastError: Cast to ObjectId failed for value "undefined" at path "_id" for model "Space"

这是我的路线:

获取

app.get('/spaces/:id', (req,res) => {
Space.findById(req.params.id).populate('posts').exec((err, space) => {
    if(err){
        console.log(err);
    } else {
        res.send(space);
    }
});

});

发布

app.post('/spaces/:id/posts', (req,res) => {

Space.findById(req.params.id, (err, space) => {
    if(err){
        console.log(err);
        res.redirect('/spaces/:id');
    } else {
        Post.create(req.body, (err, newPost) => {
            if(err){
                console.log(err);
            } else {
                newPost.save();
                space.posts.push(newPost._id);
                res.redirect('/spaces/:id');
            }
        });
    }
});

});

这是我的架构:

发布架构:

const mongoose = require('mongoose');

让 postSchema = new mongoose.Schema({ 标题:字符串, 描述:字符串 });

module.exports = mongoose.model("Post", postSchema);

空间架构:

const mongoose = require('mongoose');

让 spaceSchema = new mongoose.Schema({ 标题:字符串, 描述:字符串, 帖子:[ { 类型:mongoose.Schema.Types.ObjectId, 参考:“发布” } ] });

module.exports = mongoose.model('Space', spaceSchema);

【问题讨论】:

  • 在调用findById方法console.log(mongoose.isValidObjectId(req.params.id))之前检查req.params.id是否是一个有效的ObjecId
  • 嗨!我刚试了一下,我得到了“真实”。
  • 看起来req.params.id 未定义。做一个 console.log(req.params.id)
  • 我收到了 req.params.id 的字符串。好像已经定义好了。

标签: node.js mongodb mongoose schema


【解决方案1】:

由 MongoDB 提供的 ObjectID。它是 bsonType ID,它是用于在集合中存储文档的唯一 id。

CastError: Cast to ObjectId failed for value “:id” at path “_id” for model

当我们收到此类错误时,这意味着您发送的 ObjectId 无效,因此您需要先使用 regex 或 mongoose inbuild 函数检查它

const mongoose = require('mongoose');
const ObjectId = mongoose.Types.ObjectId;

let orderId = null
try {
  orderId = ObjectId(req.query.orderId)
} catch (InvalidObjectIdException) {
  // send invalid orderId
}

另外,您可以通过正则表达式检查let checkForValidMongoDbID = new RegExp("^[0-9a-fA-F]{24}$");

ObjectId 应在继续请求之前进行验证。

function isValidObjectID(parameter, name) {
  let checkForValidMongoDbID = new RegExp("^[0-9a-fA-F]{24}$");
  return checkForValidMongoDbID.test(parameter)
}
// your controller
app.post('/spaces/:id/posts', (req, res) => {
  if (isValidObjectID(req.params.id) === false) {
    res.send("Please provide correct object id")
    return
  }
  Space.findById(req.params.id, (err, space) => {
    if (err) {
      console.log(err);
      res.redirect('/spaces/:id');
    } else {
      Post.create(req.body, (err, newPost) => {
        if (err) {
          console.log(err);
        } else {
          newPost.save();
          space.posts.push(newPost._id);
          res.redirect('/spaces/:id');
        }
      });
    }
  });
});
// http://localhost:8080/spaces/324234/post ==> invalid
// http://localhost:8080/spaces/61056c908cca27df3db2e4c9/post ==> valid

【讨论】:

  • 对代码没有任何评论的代码答案不被认为是一个好的答案,请详细说明代码块中发生的情况。
【解决方案2】:

我也遇到了类似的错误,参数中的 id 错误

正确的id:

products/updateproductbyid/60fp5f46196351c7e381c0085

错误的 ID:

products/updateproductbyid/660fp5f46196351c7e381c0085

代码:

 await productsModel.findByIdAndUpdate(
{ _id: _id },
newProduct,
(err, result) => {
  if (err) {
    res.send(err);
  } else {
    res.send("changed!");
  }
}

错误:

CastError: 模型“products”的路径“_id”处值“{ _id: '660fp5f46196351c7e381c0085'}”(类型对象)的值转换为 ObjectId 失败

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 2020-11-19
    • 2017-08-18
    • 2016-11-11
    • 2017-03-26
    • 2017-05-26
    • 2020-05-20
    • 2020-12-10
    • 2021-02-21
    相关资源
    最近更新 更多