как вернуть ответ почтальону с помощью nodejs - PullRequest
0 голосов
/ 10 октября 2018

Я изучаю nodejs с помощью экспресс.Поэтому я подключил mongodb и извлек данные из базы данных с помощью nodejs.Когда я нажимаю на ссылку от почтальона, я могу получить данные, но проблема не в том, чтобы вернуть ответ почтальону.Я вижу результат в консоли.если я попытался setTimeout , он работает нормально ... но это не правильный способ сделать это.Я попытался метод res.send (), чтобы вернуть ответ, но бесполезно.Пожалуйста, помогите мне решить это

 app.post('/getmongo',function (req,res){
    console.log("I received a request");
    console.log(req.body.filters)
    filters = req.body.filters
    console.log(typeof filters)
    var ism = []
    db.collection('collection_name').find(filters,function(err,data){
         if(err){
            console.log(err)
            return res.send(500,'something went wrong')
         }
         else{

             data.each(function(err,doc){
                 console.log(doc)
                 ism.push(doc)
             });
             setTimeout(function(){res.send({"ISM":ism})},1000)
         }
    });

 });

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Вместо итерации в данных и вставки результата в массив, вы можете вернуть результат поиска в виде массива.

Следовательно, ваша функция будет выглядеть примерно так:

app.post('/getmongo', function(req, res) {
    filters = req.body.filters;
    db.collection('collection_name').find(filters).toArray(function(err, docs) {
        if (err) {
            console.log(err);
            return res.send(500, 'something went wrong');
        } else {
            res.send({"ISM": docs});

            // If you want to return JSON
            // res.json({"ISM": docs});
        }
    });
});

http://mongodb.github.io/node-mongodb-native/3.1/quick-start/quick-start/#find-documents-with-a-query-filter

0 голосов
/ 10 октября 2018

Ваш параметр data не является "вашими данными": D, это объект Cursor, а функция each является асинхронной функцией.Без setTimeout, data.each (не как Array.prototype.forEach) и res.send({"ISM":ism}) будут выполняться одновременно (ism теперь равно []).

Если вы хотите продолжать использовать cusor method, вам нужно изменить код:

data.each(function(err,doc){
    if(doc !== null) {
        console.log(doc)
        ism.push(doc)
    } else {
        // close you db connection...
        res.send({"ISM":ism})
    }
});

Или вы можете использовать метод .toArray (если вы используете require('mongodb').MongoClient), чтобы вернуть data:

db.collection('collection_name').find(filters).toArray(function(err, items){
    if(err){
       console.log(err)
       return res.send(500,'something went wrong')
    }
    else{
        res.send({"ISM": items})
    }
})

https://mongodb.github.io/node-mongodb-native/api-generated/cursor.html

0 голосов
/ 10 октября 2018

Он отправляет нулевые данные из-за своей асинхронной природы.

Вы можете использовать такой взлом.

data.each(function(err,doc){
            console.log(doc)
            ism.push(doc)
            if(data.length === ism.length) {
              res.send({"ISM":ism})
            }
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...