首页 > 解决方案 > 如何停止数据库承诺阻塞 Express 服务器中的主线程?

问题描述

我有一个 NodeJS 服务器,我尝试使用 Promise 来调用我的数据库,这样我的服务器仍然能够为其他客户端提供更快的查询。

这是我能做的最简单的代码:

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 次 /slow,则第二个控制台日志“慢速路由”仅在第一次完成后触发,结果在 12 秒后而不是 6 秒后出现。

我过去同时成功地打了2个电话,我只是不明白为什么我现在不能这样做。

标签: node.jsexpress

解决方案


await pool.query('SELECT pg_sleep(6)')你的代码的其余部分会停止,直到它完成

等待 MDN

你可以做

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:我不运行这段代码


推荐阅读