Я пытаюсь сделать находку по имени пользователя или _id как этотПоиск по 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. Я не могу думать о каком-либо другом способе решить this.I пытался регулярное выражение в MongoDB Node check if objectid is valid
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);
});
};
И я получаю ту же ошибку, потому что это асинхронный. Там должно быть лучше, чем это
Почему точно ваш первый вариант не работает? он должен работать, если вы ожидаете, что он вернет массив, а не один пользователь. –
Что вы подразумеваете под _ "он не может вернуть действительный ObjectID" _? – robertklep
@KevinB Это терпит неудачу, потому что, когда вы предоставляете {_id: req.params.id} имя пользователя вместо 24-битного шестнадцатеричного mongo, выдает ошибку и запрос терпит неудачу. Так что если req.params.id «556e06662a6efc6c2544773b», он отлично работает, но его «myusername» не работает – Jake