collection.find () для 2 коллекций и предоставления информации для просмотра - mongoose - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь извлечь все документы из 2 коллекций, используя collection.find(), и помещаю всю информацию в представление e js, используя res.render, используя mon goose (node.js).

Мой код:

var eduvents = {
    en: [],
    ar: []
};

Eduvent.find({}, function(err, allEduvents) {
   allEduvents.forEach(function(eduvent) {
       eduvents.en.push(eduvent);
   });
});

EduventAr.find({}, function(err, allEduvents) {
    allEduvents.forEach(function(eduvent) {
       eduvents.ar.push(eduvent);
    });
});

console.log(eduvents);

, когда это выполняется, я получаю это:

{ en: [], ar: [] }

Разве я не должен получить все Eduvent и EduventAr запросов в переменной eduvent ?

1 Ответ

1 голос
/ 11 февраля 2020

Поскольку mon goose find является синхронным, ваша консоль будет работать немедленно, прежде чем ответ на запрос будет возвращен, следовательно, она пуста

Вы можете сделать что-то подобное, если хотите придерживаться этого callbacks подход

var eduvents = {
    en: [],
    ar: []
};

Eduvent.find({}, function(err, allEduvents) {
    allEduvents.forEach(function(eduvent) {
       eduvents.en.push(eduvent);
    });

    EduventAr.find({}, function(err, allEduvents) {
        allEduvents.forEach(function(eduvent) {
            eduvents.ar.push(eduvent);
        });
        console.log(eduvents);
    });
});

Другой подход заключается в использовании async await, поскольку mon goose уже имеет поддержку Promises

Использование Asyn c / AWAIT

async function GetEvents(){

    try {

        var eduvents = {
            en: [],
            ar: []
        };

        var allEvents = await Eduvent.find();
        // Here you can simply assign array to the `eduevents.en` if you are not altering anything from `allEduvents`
        eduvents.en = allEduvents;

        var otherEvents = await EduventAr.find();
        eduvents.ar = otherEvents;

        console.log(eduvents);

    } catch(err) {
        console.log("ERROR",err);
    }

}
...