CastError:模型的路径“_id”处的值“:id”转换为 ObjectId 失败

Posted

技术标签:

【中文标题】CastError:模型的路径“_id”处的值“:id”转换为 ObjectId 失败【英文标题】:CastError: Cast to ObjectId failed for value ":id" at path "_id" for model 【发布时间】: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 的字符串。好像已经定义好了。 【参考方案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 失败

【讨论】:

以上是关于CastError:模型的路径“_id”处的值“:id”转换为 ObjectId 失败的主要内容,如果未能解决你的问题,请参考以下文章

CastError:模型“Company”的路径“_id”处的值“...”转换为 ObjectId 失败

CastError:对于猫鼬中模型的路径“_id”处的值“findByName”,转换为 ObjectId 失败

CastError:对于猫鼬中模型的路径“_id”处的值“findByName”,转换为 ObjectId 失败

Mongoose:CastError:对于模型“”的路径“_id”处的值“”,转换为 ObjectId 失败

CastError:模型“用户”的路径“_id”处的值“未定义”转换为 ObjectId 失败

NestJS 和 MongoDB | CastError:模型“Player”的路径“_id”处的值“1”转换为 ObjectId 失败