首页 > 解决方案 > CastError:模型的路径“_id”处的值“:id”转换为 ObjectId 失败

问题描述

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

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

错误:CastError:模型“Space”的路径“_id”处的值“undefined”转换为 ObjectId 失败

这是我的路线:

得到

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({ title: String, description: String });

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

空间模式:

const mongoose = require('mongoose');

let spaceSchema = new mongoose.Schema({ title: String, description: String, posts: [ { type: mongoose.Schema.Types.ObjectId, ref: "Post" } ] });

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

标签: node.jsmongodbmongooseschema

解决方案


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

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

当我们收到这种类型的错误时,这意味着您正在发送无效的 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
}

此外,您可以通过 regex 进行检查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

推荐阅读