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) { ........
问候雀!
- 为什么console.log(10150141932135203)在Firefox和Chrome中打印10150141932135204,以及如何处理这些大整数值?
- Array.pop in Node跳过并忘记一个函数项
- 所有使用Angular 2(+)和Node / Express服务器的TypeScript项目设置
- 为什么调用node.js body-parser失败,尽pipe我已经安装了它?
- Express.js:反向代理不同的Web应用程序以及资产
- TypeError:undefined不是node.js / express.js中的函数
- 如何在jade中创build一个用于node.js的variables
- 在TypeScript中,我该如何实现一个接口(a:type,b:type):any?
- 在跨域中节点js身份validation
- 找不到公共目录(404)ExpressJS和Jade
- 在单页应用程序中使用passportJS或者everyauth