Как остановить обещание базы данных заблокировать основной поток на сервере Express? - PullRequest
0 голосов
/ 18 октября 2019

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

Вот самый простой код, который я мог сделать:

const express = require('express');
const server = express();
const moment = require('moment');

require('dotenv').config();

const slowRoute = require('./routes/slow');
server.use('/slow', slowRoute);

server.listen(process.env.PORT, () =>
    console.log(
        `Listen on port ${process.env.PORT} | ${moment().format(
            'YYYY/MM/DD HH:mm:ss:SSS'
        )}`
    )
);

и мой маршрутизатор

const express = require('express');

const router = express.Router();
const pool = require('../database');

router.get('/', async (req, res, next) => {
    console.log(`Slow route`);
    let result = await pool.query('SELECT pg_sleep(6)');
    res.status(200).json(result.rows[0]);
});

module.exports = router;

Если я вызываю 2 раза / медленный, второй консольный журнал «Медленный маршрут» срабатывает только после 1-го завершения, и результат приходит через 12 секунд послевместо 6.

Я успешно делаю 2 звонка одновременно в прошлом, я просто не понимаю, почему я не могу сделать это сейчас.

1 Ответ

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

await pool.query('SELECT pg_sleep(6)') делает остальную часть вашего кода остановкой до его завершения

см. в ожидании MDN

U может сделать

router.get('/', async (req, res, next) => {
  console.log(`Slow route`);
  pool
   .query('SELECT pg_sleep(6)')
   .then( result => {
     res.status(200).json(result.rows[0]);
  })
})

Ps: Я не запускаю этот код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...