如何使用request
库将自定义响应(或错误)返回给客户端? .pipe()
将始终通过管道将原始响应发送回客户端
这将返回原始响应
request(options)
.on('error', err => {
return cb(err);
})
.on('response', response => {
// This is an error
if (response.statusCode === 500) {
const error = new Error('File not found');
return cb(error);
}
return cb(null, response, 'application/pdf');
})
.pipe(res);
这将返回我的自定义响应
request(options)
.on('error', err => {
return cb(err);
})
.on('response', response => {
// This is an error
if (response.statusCode === 500) {
const error = new Error('File not found');
return cb(error);
}
return cb(null, response, 'application/pdf');
});
// .pipe(res);
是否可以根据响应控制是否通过管道传输?
答案 0 :(得分:2)
一旦您从流中读取了数据,该数据就不会在其他地方传输了,因此您无法读取内容的第一部分,然后决定要传输整个内容,然后调用{{1 }},并希望您已经阅读的原始内容包含在管道响应中。
您也许可以阅读一些内容,准确跟踪所阅读的内容,然后,如果您决定仅通过管道传输内容,则可以发送已阅读的内容并致电.pipe()
。您必须自己进行测试,以查看是否存在可能导致您丢失一些数据的比赛条件。
如果数据不是很大,那么一个相对容易的事情就是读取所有数据(.pipe()
库可以在一种模式下使用,它只会为您获得所有响应),然后一次您拥有所有数据,就可以检查数据并确定要发送的内容。您既可以发送原始数据,也可以对其进行修改并发送修改后的数据,或者可以决定在其位置发送其他内容。
答案 1 :(得分:1)
该请求将在收到响应后立即开始管道传输。如果您想根据收到的状态码控制管道,或不控制管道,则必须在响应回调上进行管道调用,如下所示:
const req = request(options)
.on('error', err => cb(err))
.on('response', response => {
// This is an error
if (response.statusCode === 500) {
const error = new Error('File not found');
return cb(error);
}
if (typeof response.end === 'function') {
req.pipe(response);
}
if (response.req.finished) {
return cb(null, response, 'application/pdf');
}
});