流处理状态 >= 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);
}
})
我正在使用 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);
}
})