Я получаю нулевой массив после добавления к нему объекта при извлечении данных из базы данных mongodb в express с помощью метода find () - PullRequest
0 голосов
/ 08 мая 2020

Я хочу отправить массив в другой файл Но я получаю нулевой массив после добавления к нему объекта с помощью метода pu sh () в for-l oop при извлечении данных из базы данных mongodb с помощью метода find () в express

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

exports.retriveArray = () => {
    var ar = [];
    mongoClient.connect(url, (err, db) => {
        if (err) throw err;
        var database = db.db('fortask');
        database.collection('Task').find({}, { projection: { _id: 0 } }).toArray((err, res) => {
            if (err) throw err;

            for (var i = 0; i < res.length; i++) {
                ar.push(res[i].Task);
            }
            db.close();
        });
    });
    console.log(ar);
    return ar;
}

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Проблема в этом коде заключается в том, что вы ar находитесь за пределами обратного вызова и распечатываете вывод до того, как функция обновит ar. поэтому выполняется функция обратного вызова go в событие l oop и следующий оператор. Думаю, вы можете найти аналогичный вопрос по переполнению стека

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

exports.retriveArray = () => {
    var ar = [];
    return mongoClient.connect(url, (err, db) => {
        if (err) throw err;
        var database = db.db('fortask');
        return database.collection('Task').find({}, { projection: { _id: 0 } }).toArray((err, res) => {
            if (err) throw err;

            for (var i = 0; i < res.length; i++) {
                ar.push(res[i].Task);
            }
            db.close();
            console.log(ar);
            return ar;
        });
    });

}
1 голос
/ 08 мая 2020

Это асинхронная проблема, что у вас здесь. Вы отправляете данные обратно, но асинхронная задача еще не выполнена. Вот решение

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

exports.retriveArray = () => {
    var ar = [];
    return new Promise((resolve)=> {
       mongoClient.connect(url, (err, db) => {
        if (err) throw err;
        var database = db.db('fortask');
        database.collection('Task').find({}, { projection: { _id: 0 } }).toArray((err, res) => {
            if (err) throw err;

            for (var i = 0; i < res.length; i++) {
                ar.push(res[i].Task);
            } 
            resolve(ar);
            db.close();
        });
    });
    })

}

Затем вы переносите свой импорт в IIFE

(async()=> {
   var arr = await retrieve.retriveArray();
})()
...