在管道之前编辑响应标头

GJK*_*GJK 33 node.js express

对于Express中的某些请求,我有一个小代理.使用请求库,我有相当简洁的代码:

app.use('/api', function(req, res) {
    var url = rewriteUrl(req.url);

    var newReq = request(url, function(error) {
        if (error) {
            logError(error);
        }
    });

    req.pipe(newReq).pipe(res);
});
Run Code Online (Sandbox Code Playgroud)

我的问题是来自API服务器的响应包含一堆我想要删除的不需要的标头.如何在将其汇总到newReq之前从响应中删除标题res

GJK*_*GJK 59

mscdex的答案确实对我有用,但我找到了一种方式,我觉得它稍微清洁一点.在我的原始代码中,我有这一行:

req.pipe(newReq).pipe(res);
Run Code Online (Sandbox Code Playgroud)

我用这些代替了它:

req.pipe(newReq).on('response', function(res) {
    delete res.headers['user-agent'];
    // ...
}).pipe(res);
Run Code Online (Sandbox Code Playgroud)

  • 请将此答案标记为已接受 (4认同)
  • 你救了我的一天!感谢您为请求模块提供工作解决方案. (3认同)

msc*_*dex 15

使用该request模块,目前没有办法(AFAIK)进行回调而不缓冲服务器响应.所以这里有你如何用内置的方法做到这一点http.request:

app.use('/api', function(req, res) {
  var url = rewriteUrl(req.url);

  var newReq = http.request(url, function(newRes) {
    var headers = newRes.headers;

    // modify `headers` here ...

    res.writeHead(newRes.statusCode, headers);
    newRes.pipe(res);
  }).on('error', function(err) {
    res.statusCode = 500;
    res.end();
  });

  req.pipe(newReq);
});
Run Code Online (Sandbox Code Playgroud)


Yos*_*awa 7

请求很容易。

request("https://example.com/image.png")
.on("response", remoteRes => {
    // You can add/remove/modify headers here
    remoteRes.headers["content-disposition"] = "attachment; filename=awesome.png";
})
.pipe(res);
Run Code Online (Sandbox Code Playgroud)