如何在代理请求时在ExpressJS中添加/删除响应头

时间:2017-02-27 17:33:47

标签: node.js express http-proxy node-http-proxy response-headers

我有一些存储在CDN服务器上的文件,不能直接从客户端访问。因此,我通过运行ExpressJS的公共可访问服务器代理请求,并使用request模块获取数据服务器端并将其作为响应返回。

它正常工作,代码看起来像这样:

var request = require('request');
var app = express();
var internalUrl = 'https://my.storage-cdn.com/private/info/file.xml';

app.get('/somefile.xml', function (req, res) {
    request(internalUrl).pipe(res);
});

我面对上述方法的问题是:

  • storage / cdn服务器附加了一些自己的响应头 其中包括一些私人信息,因此可以是一种安全措施 在作出回应时暴露的问题。以上管道res的方法 request的对象不会删除这些标头。它通过那些 标题是响应。我想删除这些标题。
  • 我想添加一些eTag和缓存控制标头,以便缓存文件 正常。

我尝试将其更改为以下内容:

app.get('/somefile.xml', function (req, res) {
    request(internalUrl, function (err, response, body) {
        if (!err && response.statusCode == 200) {
            res.writeHead(200, {...});   // write custom headers I need
            res.end(body);
        }
    });
});

这允许我根据自己的喜好覆盖标题,但在这种方法中,我必须先等待整个文件在服务器端下载,然后才开始在我的响应中发送字节,并且有些文件和1MB,它确实会对响应时间造成不利影响。

所以我的问题是 - 有没有办法在开始发送响应之前不必等待整个文件在服务器端下载,但仍然可以操作响应头?

1 个答案:

答案 0 :(得分:3)

你可以挂钩'响应'事件:

const SECRET_HEADERS = ['Set-Cookie', 'X-Special-Token']

app.get('/somefile.xml', function (req, res) {
  request(internalUrl).on('response', function (response) {
    SECRET_HEADERS.forEach(function (header) {
      response.removeHeader(header)
    })
  }).pipe(res)
})