CastError:对于路径“_id”的值“...”,转换为ObjectId失败

时间:2014-07-03 12:11:37

标签: node.js mongodb express

我在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);
    });    
});

0 个答案:

没有答案