流处理状态 >= 400 node.js 请求 http 客户端

Handling status >= 400 in streamed node.js request http client

我正在使用 https://github.com/request/request 发出 HTTP 请求,我想接收 JSON。响应会非常大,所以我想使用流方法来处理响应。但是,API 我正在调用 returns 'text/plain' 以获得状态 >= 400,这意味着我的 JSONStream 将失败。代码:

  req = request.get({url: data_url});
  req.pipe(require('JSONStream').parse([true]))
    .pipe(require('stream-batch')({maxItems: 1000}))
    .on('data', callback)
    .on('end', done);

错误:

Invalid JSON (Unexpected "I" at position 0 in state STOP)

("A" 如 "Internal server error".) 似乎请求不会为完成的请求发出 'error' 事件,因此添加 req.on('error', (err) => ...) 不会触发。我可以添加

req.on('response', function(res) {
  if(res.statusCode >= 400) { ... }
})

但是后来我好像看不到正文中的错误信息。

如何获取错误消息、有意义地记录并中断处理?

由于传递给 response 事件的参数也是一个可读流,您可以在其处理程序中创建管道:

req.on('response', function(res) {
  if (res.statusCode >= 400) {
    let chunks = [];
    res.on('data', c => chunks.push(c))
       .on('end', () => {
         console.log('error', Buffer.concat(chunks).toString());
       });
  } else {
    res.pipe(require('JSONStream').parse([true]))
       .pipe(require('stream-batch')({maxItems: 1000}))
       .on('data', callback)
       .on('end', done);
  }
})