Как сделать синхронный запрос к базе MongoDB? [дубликат]

87
13 декабря 2021, 04:30
На этот вопрос уже даны ответы здесь:
Как вернуть значение из события или из функции обратного вызова? Или хотя бы дождаться их окончания (3 ответа)
Закрыт 2 года назад.

Как сделать синхронный запрос к базе MongoDB?

Есть код который подключается к базе и берет из нее выборку и он как бы отрабатывает, но в переменной allNews, вместо данных бывает undefined.

Так понимаю проблема в collection.each((err, item){}), тк он ведет себя как то асинхронно (сначала выводится "Цикл отработал", а потом "работа в цикле")
Если есть другие варианты (более простые) как можно сделать синхронный запрос, буду рад почитать.

Если будет нужна какая-либо еще информация касаемо вопроса, дам.
P.S. Первый проект на Mongo, не серчайте :P

// Подключаемся к БД и берем выборку
let connectDB = async() => {
    let queryProm = new Promise((resolve, reject) => {
        let allNews = [];
        client.connect(err => {
            assert.equal(null, err);
            let db = client.db(dbName);
            let collection = db.collection("news").find({title: {$exists: true}}, {_id: 0});
            collection.each((err, item) => {
                if (item !== null) {
                    console.log("Работа в цикле");
                    allNews.push(item);
                };
            });
            console.log("Цикл отработал");
            resolve(allNews);
            client.close();
        });
    });
    return (await queryProm);
}
// После получения выборки что-нибудь делаем
connectDB().then((data) => {
    console.log( data );
});
Answer 1

Заменил метод each на forEach (ссылка на док. ниже).
https://docs.mongodb.com/manual/reference/method/cursor.forEach/#example

На вход этого метода передаются 2 функции:

  1. Функция, которая возвращает элемент коллекции
  2. Функция, которая возвращает, либо null (завершение цикла), либо информацию об ошибке.

Пример:

collection.forEach((item) => {
    console.log(`Элемент цикла: ${item}`);
}, (end) => {
    console.log(`
        Цикл кончился (${end}) \n
        Сюда мы и передаем success() \n
        для синхронного выполнения функции
    `);
});

collection - коллекция из базы, в моем случае news
let collection = db.collection("news").find({title: {$exists: true}}, {_id: 0});

READ ALSO
Использование promise с циклом for

Использование promise с циклом for

Задача: собираю данные геодаты с сервера (не моего)Для этого формирую запрос для определенного промежутка координат и в цикле for отправляю...

96
Помогите установить javascript на сайт

Помогите установить javascript на сайт

В разработке сайта, начинающийНе могу подцепить javascript к шаблону сайта

117
Как сделать открытие следующего блока из квадрата, расположенного в первом блоке?

Как сделать открытие следующего блока из квадрата, расположенного в первом блоке?

Разместил вот здесь всю реализациюВ каком направлении думать, чтобы реализовать раскрытие нового блока как-бы из квадрата, который расположен...

69