2015-06-04 2 views
2

Я пытаюсь сделать находку по имени пользователя или _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); 
    }); 

}; 

И я получаю ту же ошибку, потому что это асинхронный. Там должно быть лучше, чем это

+0

Почему точно ваш первый вариант не работает? он должен работать, если вы ожидаете, что он вернет массив, а не один пользователь. –

+0

Что вы подразумеваете под _ "он не может вернуть действительный ObjectID" _? – robertklep

+0

@KevinB Это терпит неудачу, потому что, когда вы предоставляете {_id: req.params.id} имя пользователя вместо 24-битного шестнадцатеричного mongo, выдает ошибку и запрос терпит неудачу. Так что если req.params.id «556e06662a6efc6c2544773b», он отлично работает, но его «myusername» не работает – Jake

ответ

2

Скорее всего, ваш первый запрос не будет работать, потому что 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); 
    }); 
}; 
Смежные вопросы