我有一个端点充当我的另一个服务的代理,它实质上是通过管道传送GET请求,如下所示:
var options = {
'uri': url,
'headers': req.headers,
'method': req.method,
'time' : true
}
request(options, function(error, response, body){
if (error){
...
}
}).pipe(res);
我想做的是防止此代理应用程序跟随重定向并返回带有200状态代码的完整内容,而只是将完整重定向传递回初始请求。
我已经玩过类似的东西,但是它只是在管道已经返回200之后才执行该代码:
request(options, function(error, response, body){
if (error){
...
}
if (response.statusCode == 302){
res.redirect(302, response.headers.location);
}
}).pipe(res);
有没有一种方法可以中断此管道过程,以便可以手动重新发送从此代理请求返回的重定向,同时允许非重定向照常继续进行?
基本上,您需要将可读流分配给变量,并在发出“响应”事件时暂停该流。然后,您可以执行重定向或继续传递响应。像这样的东西应该可以工作(因为我在移动设备上,所以现在无法测试):
const requestStream = request(options);
r.pause();
requestStream.on('response', (response) => {
if(response.statusCode === 302) {
// destroy the readable stream to prevent leaking
requestStream.destroy();
return res.redirect(302, ...)
}
requestStream.pipe(res);
r.resume();
});