ObjectID.createFromHexString不识别input的hexstring

我正在通过Ciaran Jessup的创build一个基本的博客作为节点介绍的演练。 当我尝试查看文章时,出现以下错误:

500 Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters at Function.createFromHexString (/Users/me/Dropbox/projects/node/howtonode_blog/node_modules/mongodb/node_modules/bson/lib/bson/objectid.js:212:11) at /Users/me/Dropbox/projects/node/howtonode_blog/articleprovider-mongodb.js:38:64 at /Users/me/Dropbox/projects/node/howtonode_blog/articleprovider-mongodb.js:16:10 at Db.collection (/Users/me/Dropbox/projects/node/howtonode_blog/node_modules/mongodb/lib/mongodb/db.js:484:44) at ArticleProvider.getCollection (/Users/me/Dropbox/projects/node/howtonode_blog/articleprovider-mongodb.js:14:11) at ArticleProvider.findById (/Users/me/Dropbox/projects/node/howtonode_blog/articleprovider-mongodb.js:34:10) at app.post.articleProvider.addCommentToArticle.person (/Users/me/Dropbox/projects/node/howtonode_blog/app.js:51:19) at callbacks (/Users/me/Dropbox/projects/node/howtonode_blog/node_modules/express/lib/router/index.js:161:37) at param (/Users/matty/Dropbox/projects/node/howtonode_blog/node_modules/express/lib/router/index.js:135:11) at param (/Users/matty/Dropbox/projects/node/howtonode_blog/node_modules/express/lib/router/index.js:132:11) 

这里是相关的代码片段:

来自app.js:

 app.get('/blog/:id', function(req, res) { articleProvider.findById(req.param.id, function(error, article) { res.render('blog_show.jade',{title: article.title, article: article}) }) }) 

从articleprovider-mongodb.js:

 ArticleProvider.prototype.findById = function(id, callback) { this.getCollection(function(error, article_collection) { if(error) callback(error); else { article_collection.findOne( // THIS IS THE LINE IN QUESTION BELOW {_id: article_collection.db.bson_serializer.ObjectID.createFromHexString(id)}, function(error, result) { if(error) callback(error); else callback(null, result); } ); } }); }; 

我试图将id对象转换为string,并试图直接将其作为对象传递。 但是,我的JavaScript是非常糟糕的,我没有运气。 我曾尝试传递String(id)id + ""而不是id

{_id: id}

{_id: article_collection.db.bson_serializer.ObjectID(id)}

我真的很感激有人指出我做错了什么。

谢谢阅读!

编辑: console.log("req.param.id is " + req.param.id)输出“req.param.id是未定义的”url, http://localhost:3000/blog/516afb1064036bb345000001 ,是正确的,因为我直接通过516afb1064036bb345000001到ArticleProvider.findById调用,它的工作。

编辑2:它改变了req.param.id req.params.id 。 然而,在我的app.post函数中,我使用了如下的单数param ,仍然有效:

 articleProvider.save({ title: req.param('title'), body: req.param('body') } ... 

为什么这个单数的param在这里工作? params是否具体指的是在URI中传递的参数?

没有实际显示什么id传递,我会build议你validation路线。 添加这个:

 app.get('/blog/:id([0-9a-f]{24})' 

这将确保传递的id始终有效。

从mongodb或bson库中获取ObjectID ,而不是达到如此多的级别也更好。

 var ObjectID = require('mongodb').ObjectID // later var id = ObjectID.createFromHexString(req.params.id) 

如果这些不起作用,请通过console.log(req.params.id)向我们显示传递的实际string

而且, findOne()查询中的最后一个callback是完全不必要的。 其实你可以做一下collection.findOne(id, callback)