0
我有一些文件存储在CDN服务器上,不能直接从客户端访问。因此,我通过运行ExpressJS的公共可访问服务器代理请求,并使用request
模块来获取数据服务器端并将其作为响应返回。如何在代理请求时在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);
});
我面临着上述方法的问题是:
- 存储/ 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,但它确实会对响应时间产生不利影响。
所以我的问题是 - 有没有办法不必等待整个文件在服务器端下载之前开始发送响应,但仍然能够操纵响应头?
谢谢。这对我来说是诀窍。当数据流开始变为可用时,或者当所有http数据从删除服务器加载时,您是否都知道是否触发了“响应”事件。我想了解流如何工作,以及这与“数据”事件有何不同。 – codneto
@codneto在接收到标题和HTTP状态之后,以及任何'数据'事件触发之前触发'响应'事件。 – idbehold