我在Mongoose中遇到MongoDB _id
值的问题。
我有一个使用_id
的网址,它看起来像这样:/posts/53b42b3d2cc1ef603b41d54a
。
问题是,当我从id
获取此request.params
时,Mongoose会抛出错误:
ERROR: { [CastError: Cast to ObjectId failed for value "3b42b3d2cc1ef603b41d54a" at path "_id"]
message: 'Cast to ObjectId failed for value "3b42b3d2cc1ef603b41d54a" at path "_id"',
name: 'CastError',
type: 'ObjectId',
value: '3b42b3d2cc1ef603b41d54a',
path: '_id' }
但是当我明确硬编码_id
时,不会抛出任何错误,我从数据库中获取数据就好了。
这是我的代码:
// This works fine, no errors are thrown
var _id = new mongoose.Schema.ObjectId("53b42b3d2cc1ef603b41d54a").path;
// This throws an error.
// But req.params[0] is just the same value:
// /post/53b42b3d2cc1ef603b41d54a
var _id = new mongoose.Schema.ObjectId(req.params[0]).path;
Post.findById(_id, function (err, posts) {
if (err) {
console.log("ERROR: ", err);
}
var model = {
posts: JSON.parse(JSON.stringify(posts))
};
console.log("model: ", model);
res.render('posts', model);
});
为什么会这样?这有什么不对?如何以正确的方式投射req.params[0]
?
UPD :
req.params
将引导5
从我的网址中抛出。
这是一个网址:
posts/53b42b3d2cc1ef603b41d54a
以下是req.params
返回的内容:
{ '0': '3b42b3d2cc1ef603b41d54a' }
为什么会这样?
UPD 2
这是因为该路线的regExp错误。
错误的第一个字符:/^\/[^new](\w+)$/
正确的一个:/^\/([^new]\w+)$/
现在完整的代码:
router.get(/^\/([^new]\w+)$/, function(req, res) {
var _id = new mongoose.Schema.ObjectId(req.params[0]).path;
Posts.findById(_id, function (err, posts) {
if (err) {
console.log("ERROR: ", err);
}
var model = {
posts: JSON.parse(JSON.stringify(posts))
};
res.render('posts', model);
});
});