我正在尝试按用户名或_id这样的
进行查找exports.getUser = function (req, res){
User.find({ $or: [ {username:req.params.id}, {_id:req.params.id} ] })
.exec(function (err, collections) {
res.send(collections);
});
};
当我通过_id搜索但是用户名失败时它会起作用,因为它无法返回有效的OjectID。我试着像这样做两个单独的查询
exports.getUser = function (req, res){
User.findOne({username:req.params.id}).exec(function (err, user) {
if (user)
res.send(user);
});
User.findById({_id:req.params.id}).exec(function (err, user) {
if (user)
res.send(user);
});
};
但如果用户不存在,则会挂起,因为它从不发送响应。由于节点是异步的,如果我添加
,我会得到Error: Can't set headers after they are sent.
else
res.sendStatus(400);
到findById查询。我想不出任何其他方法来解决这个问题。我在Here
中尝试了正则表达式exports.getUser = function (req, res){
var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$");
if(checkForHexRegExp.test(req.params.id)){
User.findById({_id:req.params.id}).exec(function (err, user) {
if (user)
res.send(user);
});
}
User.findOne({username:req.params.id}).exec(function (err, user) {
res.send(user);
});
};
我得到了同样的错误,因为它是异步的。必须有比这更好的方法
答案 0 :(得分:5)
很可能你的第一个查询无法正常工作,因为MongoDB期望_id
是一个ObjectId,而不是一个字符串(req.params.id
可能是):
var ObjectId = require('mongoose').Types.ObjectId;
exports.getUser = function (req, res) {
var id = req.params.id;
var $or = [ { username : id } ];
// Does it look like an ObjectId? If so, convert it to one and
// add it to the list of OR operands.
if (ObjectId.isValid(id)) {
$or.push({ _id : ObjectId(id) });
}
User.find({ $or : $or }).exec(function (err, collections) {
// TODO: check for errors
res.send(collections);
});
};