Mongoose - функция внутри метода .find не передает результат

Как успешно передать результат функции в метод .find? Я хочу, чтобы аргумент, переданный через body-parser, использовался как значение для ключа «имя», если пользователь отправил непустую строку. Если пользователь отправил пустую строку, то пустой объект должен быть передан в метод .find.

Функция console.log работает. Если я отправляю пустую строку, на консоль выводится «пустая база данных запроса». Точно так же, если я отправлю любую другую строку, она будет правильно напечатана на консоли.

Как я могу передать req.body.querydb в качестве значения для ключа «имя»?

HTML

 <form method="POST" action="form_query">
 <input type="textarea" name="querydb">
 <br><br>
 <button> Query </button>
 </form>

.JS

router.post('/form_query', function(req,res) {
someModel.find(function(err,results){
    if(!req.body.querydb){
        console.log("empty querydb")
        return {}
    } else {
        console.log(req.body.querydb)
        return {name:req.body.querydb}
    }
}).exec(function(err, result) {
    if (err) {
        send(err)
    } else {
        console.log('omg')
    }

Большое спасибо !


person mack44    schedule 02.03.2017    source источник


Ответы (3)


В мангусте у вас есть две возможности сделать запрос на поиск

  • функция find(query, callback)
  • построитель запросов

Я рекомендую вам использовать функцию find(). В вашем случае ваш код больше похож на этот:

router.post('/form_query', function(req,res, next) {
    someModel.find({
        name : req.body.querydb
    }, function (err, users) {
        if (err) {
            // request has an error like connection problem
            res({ error : err });
            return;
        }

        // request works correctly, you can send the users array for example
        res(users);
    });
});

Функция find работает так же, как и функция find() mongodb pure, и для меня это лучший способ сделать ваши запросы.

РЕДАКТИРОВАТЬ :

Желательно контролировать входящие переменные наилучшим образом для выполнения этого поиска.

Например, Вы можете сделать это:

let findQuery = {};

if (req.body.querydb) {
    findQuery.name = req.body.querydb
}

someModel.find(findQuery, function (err, users) {
    // ...
});
person throrin19    schedule 02.03.2017
comment
Идея здесь правильная, но я бы сначала проверил ввод, чтобы убедиться, что он существует до запроса, чтобы избежать ошибки, и, возможно, проверить его, чтобы убедиться, что он не вернет больше, чем должен, если есть какие-либо ограничения в системе, что-то например, req.body.querydb = {$exists: true} вернет все данные с именем, которое может быть неприемлемо в системе. - person Andy Macleod; 02.03.2017
comment
Обычно параметр name экранируется, и поэтому исследование выполняется на name : " {$exists: true} ". Но в вашем случае я рекомендую проверить и изменить параметр перед find() - person throrin19; 02.03.2017
comment
Спасибо за ответы и извините за опоздание. Не уверен, что это то, что я искал, или, возможно, я недостаточно хорошо сформулировал это. курсив Если пользователь отправил пустую строку, то пустой объект должен быть передан в метод .find. Причина, по которой я делаю оператор 'if', заключается в том, что .find({name:req.body.name }) возвращает 0 результатов, когда пользователь отправляет пустую форму. Вместо этого я хочу, чтобы API возвращал результаты, как если бы был выполнен .find({}) и была возвращена вся коллекция, определенная внутри someModel. Пожалуйста, дайте мне знать, если ясно. Не уверен, что редактирую первый пост (?) - person mack44; 03.03.2017

Я не совсем уверен, что вы ищете, но, пытаясь понять как можно больше, я даю код. Таким образом, вы передаете req.body.querydb в качестве значения для ключа «имя».

router.post('/form_query', function(req,res) {
someModel.find({name:req.body.querydb},function(err,results){
if(!req.body.querydb){
    console.log("empty querydb")
    return {}
} else {
    console.log(req.body.querydb)
    return {name:req.body.querydb}
}
}).exec(function(err, result) {
if (err) {
    send(err)
} else {
    console.log('omg')
}
person node_saini    schedule 02.03.2017

Из того, что я могу сказать, вы хотите передать значение из API в запрос монго.

Возможно, имеет смысл определить запрос вне фактического вызова, а затем создать его по мере необходимости или обеспечить передачу значения перед переходом к запросу.

Например:

router.post('/form_query', function(req,res) {
    if(!req.body.querydb) {
        return res.status(404).send("empty querydb");
    }

    // validate querydb param

    someModel.find({ name: req.body.querydb }, function(err,results){
        if(!req.body.querydb){
            console.log("empty querydb")
            res.send
        } else {
            console.log(req.body.querydb)
            return res.status(200).send(results);
        }
    })
});

Если вы используете мангуст, то обратный вызов будет вызван после выполнения, а запрос — это первый параметр, переданный в функцию .find.

person Andy Macleod    schedule 02.03.2017