首页 > 解决方案 > 如何中断 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);

有没有办法可以中断这个管道进程,以便我可以手动重新发送从这个代理请求返回的重定向,同时允许非重定向像往常一样继续?

标签: node.jsredirectproxy

解决方案


基本上,您需要将可读流分配给变量并暂停流,直到发出“响应”事件。然后你要么做重定向,要么继续管道响应。像这样的东西应该可以工作(因为我在移动设备上,所以现在无法测试):

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();
});

推荐阅读