0

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

Первый запрос отрабатывает нормально, до рендеринга, а вот запрос, который в forEach - работает послле(во время) рендеринга.

const Sequelize = require("sequelize")

let express = require('express');
let router = express.Router();
let db = require('../db');
const Op = Sequelize.Op;

router.post(['/', '/booking'], async function (req, res, next) {

    // поиск номеров, удовлетворяющих запросу по количеству проживающих взрослых и детей
    let rooms = await db.Room.findAll({
        attributes: ['id', 'countRooms'],
        where: {
            [Op.and]: [
                {
                    aPlaces:
                        {[Op.gte]: req.body.aPlaces}
                },
                {
                    cPlaces:
                        {[Op.gte]: req.body.cPlaces}
                }
            ]
        }
    });

    var masRooms = [];
    // поиск количества свободных номер на выбранные даты
    rooms.forEach(async function (room) {
        var countRooms = await db.Booking.findAndCountAll({
                where: {
                    [Op.and]: [
                        {
                            [Op.or]: [
                                {
                                    [Op.and]: [
                                        {
                                            dateIn:
                                                {[Op.lte]: req.body.DateIn}
                                        },
                                        {
                                            dateOut:
                                                {[Op.gte]: req.body.DateIn}
                                        }]
                                },
                                {
                                    [Op.and]: [
                                        {
                                            dateIn:
                                                {[Op.lte]: req.body.DateOut}
                                        },
                                        {
                                            dateOut:
                                                {[Op.gte]: req.body.DateOut}
                                        }]
                                },
                                {
                                    [Op.and]: [
                                        {
                                            dateIn:
                                                {[Op.gte]: req.body.DateIn}
                                        },
                                        {
                                            dateOut:
                                                {[Op.lte]: req.body.DateOut}
                                        }]
                                }
                            ]
                        },
                        {
                            id:
                                {[Op.eq]: room.id}
                        }]
                }
            });
        if (countRooms.count < room.countRooms) {
            masRooms.push(room);
        }
    });

    res.render('booking', {title: 'Бронирование номера', rooms: masRooms});
})
;

module.exports = router;

скриншот лога

  • А добавить анимацию загрузки ? Это нельзя сделать ? Или притормозить появление view – Егор Глухов Mar 30 '19 at 06:39
  • Замените rooms.forEach на rooms.map и оберните его в await Promise.all(); – Yaant Mar 30 '19 at 08:20

1 Answers1

0

проблема здесь возможно в том что цикл foreach не ждет выполнения колбека хоть от и прописан как async. для выполнения асинхронных циклов применяют for...of. У тебя же выходит что цикл запустил запросы , они еще не отработали а ты уже рендеришь. Надеюсь проблема в этом.

вот тут есть неплохая статья по этому - https://medium.com/webbdev/js-8dfa059cae97