首页 > 解决方案 > Node.js Express postgres 流数据以响应

问题描述

我正在使用Node.js Express和 postgres db 来显示一些数据,并且我已经构建了一个 api,它可以为我提供 CSV 格式的数据。为了实现最佳解决方案,我正在使用流。所以我只使用了 pg.Poolpg-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"

标签: node.jspostgresqlexpressstreamresponse

解决方案


推荐阅读