【问题标题】:nodejs with express streaming http response具有快速流式 http 响应的 nodejs
【发布时间】:2020-02-15 12:26:07
【问题描述】:

我有以下测试代码:

const compression = require('compression');
const bodyParser = require('body-parser')
const cors = require('cors')
const { pool, connectionString } = require('./config')
const { handleError, ErrorHandler } = require('./error')

const app = express()
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
app.use(cors())
app.use(compression());
const getEvents = (request, response) => {
    pool.connect((err, client, release) => {
        if (err) {
            throw new ErrorHandler(500, err.stack);
        }
        if(!request.query.FromTime){
            throw new ErrorHandler(400, 'Required paramter FromTime is missing.');
        }
        if(!request.query.ToTime){
            throw new ErrorHandler(400, 'Required paramter ToTime is missing.');
        }
        let fromtime = request.query.FromTime
        let totime = request.query.ToTime
        console.log("FromTime: ",fromtime," ToTime: ",totime);
        let query = 'SELECT data FROM logs WHERE time BETWEEN '+fromtime+' AND '+totime+' ORDER BY time DESC';
        console.log(query)
        var stream = client.query(query, (error, results) => {
            if (error) {
                throw new ErrorHandler(500,error);
            }
            response.status(200).json(results.rows)
        })
    })
}
...
app
  .route('/events')
  // GET endpoint
  .get(getEvents)
  // POST endpoint
  .post(addEvent)

app.use((err, req, res, next) => {
  handleError(err, res);
});
// Start server
app.listen(process.env.PORT || 3002, () => {
  console.log(`Server listening`)
})

我一直试图让它流式传输数据,但没有成功。我确实尝试过使用 querystream 的 pg-query-stream,但在尝试时出现以下错误

var stream = client.query(new QueryStream(query));
stream.pipe(response);

_http_outgoing.js:607 throw new ERR_INVALID_ARG_TYPE('第一个参数', ^

TypeError [ERR_INVALID_ARG_TYPE]:第一个参数必须是 输入字符串或缓冲区。接收到的类型对象 在 write_ (_http_outgoing.js:607:11) 在 ServerResponse.write (_http_outgoing.js:579:10) 在 ServerResponse.write (/usr/src/app/node_modules/compression/index.js:89:18) 在 PgQueryStream.ondata (_stream_readable.js:705:22) 在 PgQueryStream.emit (events.js:193:13) 在 addChunk (_stream_readable.js:295:12) 在 readableAddChunk (_stream_readable.js:276:11) 在 PgQueryStream.Readable.push (_stream_readable.js:231:10) 在 cursor.read (/usr/src/app/node_modules/pg-query-stream/index.js:55:14) 在 Immediate.setImmediate (/usr/src/app/node_modules/pg-cursor/index.js:91:7)

【问题讨论】:

    标签: node.js express pg-query


    【解决方案1】:

    响应流默认不支持对象模式。 就像在文档中一样尝试

    const JSONStream = require('JSONStream')
    stream.pipe(JSONStream.stringify()).pipe(response)
    

    【讨论】:

    • 谢谢。我确实查看了文档,但认为我不需要它作为示例。
    猜你喜欢
    • 2012-04-02
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2018-02-19
    相关资源
    最近更新 更多