node.js - 如何停止数据库承诺阻塞 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个电话,我只是不明白为什么我现在不能这样做。
解决方案
await pool.query('SELECT pg_sleep(6)')
你的代码的其余部分会停止,直到它完成
你可以做
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:我不运行这段代码
推荐阅读
- java - 可以在单击按钮时更改特定 SVG 路径的颜色吗?
- python - 使用 Python 的 panda.Dataframe 对多传感器时间序列数据进行二次采样
- css - 带圆角的线性渐变
- php - .htaccess RewriteRule url 仅包含数字
- python - 将输出数据保存到文本文件中(每行单独一行)
- angular - 如何使用设置控制方法填充 FormArray 的值?
- javascript - 打字稿:在另一个类构造函数中创建类实例数组
- cobol - 如何在 Cobol 中进行货币分解
- r - 如何将低于列的值(因子)带到R中的其他新列
- php - 如何正确使用 laravel 中的 chunk 方法更新数千行?