node.js - Node.js Express postgres 流数据以响应
问题描述
我正在使用Node.js Express和 postgres db 来显示一些数据,并且我已经构建了一个 api,它可以为我提供 CSV 格式的数据。为了实现最佳解决方案,我正在使用流。所以我只使用了 pg.Pool,pg-query-stream并且基本上使用了示例代码:
pg.connect((err, client, done) => {
if (err) throw err;
const query = new QueryStream('SELECT * FROM table')
const stream = client.query(query)
//release the client when the stream is finished
stream.on('end', done)
stream.pipe(JSONStream.stringify()).pipe(res)
})
这与示例之间的唯一区别是我流式传输到响应而不是 process.stdout。
该解决方案运行良好,但我注意到,有时客户端不会返回到池中并永远挂在数据库中。我做了一些测试并发现,当我创建对 API 的多个查询(刷新页面 F5,...)时,响应流(以某种方式)在client.query 流完成写入之前被破坏,因此stream.on('end' ,完成)永远不会发生。目前我的解决方案是,我不是在写入流完成时释放客户端,而是在响应流关闭时释放客户端,如下所示。
pg.connect((err, client, done) => {
if (err) throw err;
//***NEW CODE***
res.on('close', function() {
stream.destroy();
done();
});
const query = new QueryStream('SELECT * FROM table')
const stream = client.query(query)
//release the client when the stream is finished
//stream.on('end', done)
stream.pipe(JSONStream.stringify()).pipe(res)
})
我只想知道,这是否是标准问题的标准解决方案,或者这不是一个好的和潜在危险的做法。
感谢您的意见。
步
版本:
“节点”:“12.16.1”,“pg”:“^8.0.0”,“pg-pool”:“^3.0.0”,“pg-query-stream”:“^3.0.4”,“express ": "~4.16.0"
解决方案
推荐阅读
- springdoc - 如何在 Springdoc Swagger v3 中表示字符串列表?
- html - 如何使内部块的边框粘在父块之外
- ios - 找不到框架 GoogleDataTransportCCTSupport
- haskell - 抢劫可消化表单标签未展开
- android - android SDK 中的 MediaExtractor、MediaCodec 和 MediaMuxer 之间有什么关系?
- javascript - 无法呈现评论
- html - 如何将 iframe 包含到 Facebook 页面/帖子中?
- c# - 为什么 Camera.ScreenPointToRay 在 3d 世界中不准确?
- mysql - mysql主表和详细表,详细数据被“加入”
- oracle - 在哪里可以找到 Oracle 时区 regionid?