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

Node.js 如何在代理请求时在ExpressJS中添加/删除响应头,node.js,express,http-proxy,node-http-proxy,response-headers,Node.js,Express,Http Proxy,Node Http Proxy,Response Headers,我有一些文件存储在CDN服务器上,不能直接从客户端访问。因此,我通过运行ExpressJS的公共可访问服务器代理请求,并使用请求模块从服务器端获取数据并返回响应 它正在工作,在代码中看起来如下所示: var request = require('request'); var app = express(); var internalUrl = 'https://my.storage-cdn.com/private/info/file.xml'; app.get('/somefile.xml',

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

它正在工作,在代码中看起来如下所示:

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);
        }
    });
});
我在上述方法中面临的问题是:

存储/cdn服务器附加一些自己的响应头 其中包括一些私人信息,因此可能是安全的 当暴露在响应中时出现问题。以及上述的res管道安装方法 要请求的对象不会删除这些头。它通过了那些 响应的标题。我想删除那些标题。 我想添加一些eTag和缓存控制头,以便可以缓存文件 正确地 我尝试过将其更改为以下内容:

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);
        }
    });
});
这允许我根据自己的喜好覆盖标题,但在这种方法中,我必须先等待整个文件在服务器端下载,然后才能开始发送响应中的字节,而且有些文件大到1MB,这确实会对响应时间产生不利影响


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

您可以挂接“响应”事件:

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

您可以连接到“响应”事件:

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

非常感谢。这对我来说是个好办法。您是否知道,当数据流开始变为可用时,或者当所有http数据都从删除服务器加载时,是否触发了“响应”事件。我试图了解流是如何工作的,以及它与“数据”事件的区别。@codneto在接收到头和HTTP状态之后以及在触发任何“数据”事件之前触发“响应”事件。谢谢。这对我来说是个好办法。您是否知道,当数据流开始变为可用时,或者当所有http数据都从删除服务器加载时,是否触发了“响应”事件。我试图了解流是如何工作的,以及它与“数据”事件的区别。@codneto“响应”事件是在接收到头和HTTP状态之后以及在触发任何“数据”事件之前触发的。