node.js - 如何中断 Node.js 中的管道请求并返回重定向?
问题描述
我有一个端点充当我的另一个服务的代理,它基本上像这样管道 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);
requestStream.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);
requestStream.resume();
});
推荐阅读
- reactjs - 单击提交按钮后如何使文本区域为空?
- html - gatsby HTML 文件太大(即由于 bootstrap-CSS)
- mysql - 试图通过 mySQL 数据库将数据输入到我的 .NET 程序中
- javascript - JS .animate 在执行完成后将元素重置为原始位置
- jmeter - Jmeter在线程中发现错误时如何停止所有线程的执行
- asp.net-core - 当用户有 2 个角色时,AuthorizeView 不起作用
- javascript - 值未推送到 javascript 中的全局数组中
- ignite - 点燃内核状态总是显示停止
- flutter - Flutter sqflite 不适用于真实设备 android
- windows - 环境变量扩展不再适用于 Windows 上的 npm run