Mar*_*ado 5 routes mongodb node.js express
我正在尝试为用户创建一条路线,以便能够检查其他用户的个人资料.但是,我希望通过2个不同的网址加入这些配置文件/profile/nickname,/profile/id以便可以使用用户的昵称或用户ID来接收配置文件.我尝试了以下代码:
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: []
});
}
});
});
Run Code Online (Sandbox Code Playgroud)
问题是,它似乎只是使用id而不是昵称,这意味着/profile/4f4ae474546708b219000005如果我访问的东西工作,但如果我访问/profile/mmellad哪个是该用户的给定昵称,我得到404页面.
还有一件事我觉得它对昵称很好用,它改变了查询
User.findOne( { $or : [{ "nickname": req.params.id },{ "_id": req.params.id }] }
Run Code Online (Sandbox Code Playgroud)
至
User.findOne( { "nickname": req.params.id } }
Run Code Online (Sandbox Code Playgroud)
在这种情况下/profile/mmellado工作正常,但使用用户ID显然没有.
这样做的正确方法是什么?我想我可能正在使用错误的方法.
另外要提到的是,如果我在mongo控制台中尝试以下代码,它也可以正常工作:
x = db.users.findOne({ $or: [ {nickname:"mmellado"}, {_id:ObjectId("4f4ae474546708b219000005")} ]})
Run Code Online (Sandbox Code Playgroud)
我通过插入正确的昵称和错误的_id来测试该代码,然后使用错误的昵称和右侧_id进行测试.在这两种情况下,x最终都包含了我需要的记录对象.
我想我可以通过一个额外的路径修复它,但我是Node.js和Express的新手,所以我不确定propper的方法是什么.
谢谢!
您是否在控制台中尝试过此操作:x = db.users.findOne({ $or: [ {nickname:"mmellado"}, {_id:ObjectId("mmellado")} ]}). 即使昵称匹配,您也会看到错误,因为它首先尝试将“mmellado”转换为 ObjectId 并且失败。这可能是您的页面在使用昵称时失败的原因。
我不知道node.js mongodb驱动程序的内部结构,但它可能会尝试在查询“_id”字段之前将参数内部转换为ObjectId(如果无效则失败)。我没有检查过这个,所以尝试一下。还可以尝试检查回调中的 err 对象。如果这是问题,解决此问题的一种方法是在查询之前检查参数是否有效 ObjectId,例如自己创建 ObjectId 并在失败时捕获异常。像这样的东西(未测试):
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 );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4296 次 |
| 最近记录: |