如何在代理请求时在 ExpressJS 中 add/remove 响应 headers

How to add/remove response headers in ExpressJS while proxying request

我有一些文件存储在无法从客户端直接访问的 CDN 服务器上。因此,我通过 public 可访问服务器 运行 ExpressJS 代理请求,并使用 request 模块获取数据 server-side 和 return 作为响应。

它正在运行,代码看起来像这样:

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

我用上述方法遇到的问题是:

我试过把它改成这样:

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

这允许我根据自己的喜好覆盖 headers,但是在这种方法中,我必须先等待整个文件在服务器端下载完毕,然后才能开始在我的响应中发送字节并使用有些文件大到 1MB,这确实会影响响应时间。

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

您可以挂接到 'response' 事件:

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