node.js - 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);
解决方案
由 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
推荐阅读
- python - 当使用python限制每个请求200个块时如何从api获取数据
- c# - 计算 MouseData/ WheelDelta 向上滚动一页
- java - 使用 Spring Boot 插入从响应正文接收到的数据
- python - “操作错误:未提供密码”,链接 python 和 sql 时
- python - 随机选择乌龟圈的位置而不重叠
- ios - 在 WKWebView iOS 中检测网站的 UI 元素
- arm64 - mmu in arm:如何映射内核代码(裸机)
- javascript - 在检查谷歌表单的输入元素时,我找不到“名称”属性。如何找到它?
- javascript - 添加了 Google API 密钥仍然收到错误 API 密钥未找到
- python - 如何使用没有 .paste() 类的 PIL 将透明图像放入另一个图像