Форматирование ответа MongoDb для API - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь получить коллекцию в MongoDb, и проблема в том, что API уже отвечает, хотя обработка еще не завершена. В общем, я пытаюсь получить результаты, используя find, перебрать результаты, используя foreach, и поместить каждую строку в массив.

Я испробовал множество предложений, но пока ни один из них не работает. Ниже приведено приблизительное представление о том, что я пытаюсь осуществить.

get: async function (req, res, next) {
        let messagesArray = []
        let sessionId = req.query.session

        client.connect(err => {
            try{
                const collection = client.db("xxxxxxx").collection("xxxxxxx")
                let results = collection.find({},{sessionId:sessionId}) 

                for (const result of results){
                   order = {"text" : order.partner+", "+order.order+ ", "+order.quantity}
                   messagesArray.push(order)
                }
            }
            catch(e){

            }

            client.close()

            res.send(200,{messages:messagesArray})
        })

    },

Ответы [ 2 ]

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

используйте await для ожидания результата:

 const MongoClient = require('mongodb').MongoClient;
 const url = 'mongodb://localhost:27017';

get: async function (req, res, next) {
        let messagesArray = []
        let sessionId = req.query.session


        const client = await MongoClient.connect(url, { useNewUrlParser: true }).catch(err => { console.log(err); });

        if (!client) { return;}


            try{
                const collection = client.db("xxxxxxx").collection("xxxxxxx")
                let results = await collection.find({sessionId:sessionId}) 
                console.log(results);      

                // ...    

            }
            catch(e){
                 console.log(e);
            }
            finally {
                client.close();
            }


    },
0 голосов
/ 10 октября 2019
Цикл

for будет выполняться асинхронно, поэтому перед тем, как завершится выполнение цикла for, отправьте res, поэтому попробуйте выполнить следующее

get: async function (req, res, next) {
        let messagesArray = []
var counter = 0;
        let sessionId = req.query.session

        client.connect(err => {
            try{
                const collection = client.db("xxxxxxx").collection("xxxxxxx")
                let results = collection.find({},{sessionId:sessionId}) 

                for (const result of results){
                   order = {"text" : order.partner+", "+order.order+ ", "+order.quantity}
                   messagesArray.push(order)
                   counter++;
                   if(counter == results.length) { 
                     client.close()
                     res.send(200,{messages:messagesArray})
                   }
                }
            }
            catch(e){

            }
        })

    },
...