Node.js + MongoDB查询与“$或”对象无法正常工作

我正在尝试为用户创build一个path,以便能够检查其他用户的configuration文件。 但是,我希望通过两个不同的URL /profile/nickname/profile/id这些configuration文件,以便可以使用用户的昵称或用户ID来接受configuration文件。 我试了下面的代码:

 app.get("/profile/:id", function(req, res) { User.findOne( { $or : [{ "nickname": req.params.id },{ "_id": req.params.id }] }, function(err, user) { if(user) { res.render('users/profile.jade', { locals: { currentUser: user, title: user.nickname +"'s Profile", jsf:[], } }); } else { res.render('404.jade', { status: 404, title: 'Page Not Found', jsf: [] }); } }); }); 

问题是,它似乎只是与id和不与昵称,这意味着如果我访问/profile/mmellad /profile/4f4ae474546708b219000005事情工作,但如果我访问/profile/mmellad这是给定用户的昵称,我得到404页面。

还有一件事情我想出来的绰号,正在改变查询从工作正常

 User.findOne( { $or : [{ "nickname": req.params.id },{ "_id": req.params.id }] } 

 User.findOne( { "nickname": req.params.id } } 

在这种情况下/profile/mmellado工作正常,但使用用户ID显然不。

什么是正确的方法来做到这一点? 我想我可能会使用一个错误的方法。

另一件要提到的是,如果我在mongo控制台中尝试下面的代码,它也可以正常工作:

 x = db.users.findOne({ $or: [ {nickname:"mmellado"}, {_id:ObjectId("4f4ae474546708b219000005")} ]}) 

我通过插入正确的昵称和错误的_id来testing该代码,然后使用错误的昵称和正确的_id进行testing。 在这两种情况下,x最终都包含了我需要的logging的对象。

我想我可以通过一个额外的路线来修复它,但是我对Node.js很陌生,并且一起expression,所以我不确定propper方法是什么。

谢谢!

你有没有在控制台中试过这个: x = db.users.findOne({ $or: [ {nickname:"mmellado"}, {_id:ObjectId("mmellado")} ]}) 即使昵称匹配,也会看到一个错误,因为它首先尝试将“mmellado”转换为ObjectId并失败。 这可能是您的网页在使用昵称时失败的原因。

我不知道node.js mongodb驱动程序的内部,但它可能会尝试将内部转换为ObjectId查询“_id”字段(如果无效,则失败)。 我没有检查这个,所以试试看。 另外尝试检查callback中的错误对象。 如果是这样的问题,解决这个问题的一个方法是在查询之前检查参数是否为有效的ObjectId,例如自己创buildObjectId,如果失败则捕获exception。 像这样(未testing):

 try { var objectId = createObjectId(req.params.id); // Create this function yourself User.findOne( { "_id": objectId }, callbackFunction ); } catch (err) { // Fall back to using nickname User.findOne( { "nickname": req.params.id }, callbackFunction ); } 

默认的_id值是12字节的二进制散列,所以你首先需要将string转换为二进制,然后使用ObjectID.createFromHexString发送查询,如下所示:

 var id = ObjectID.createFromHexString(idHex); 

然后在你的查询中使用id。

你的代码应该是这样的:

 User.findOne( { $or : [{ "nickname": req.params.id },{ "_id": ObjectID.createFromHexString(req.params.id) }] }, function(err, user) { ........ 

问候雀!