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,但它确实会对响应时间产生不利影响。

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

回答

2

你可以连接到 '响应' 事件:

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

谢谢。这对我来说是诀窍。当数据流开始变为可用时,或者当所有http数据从删除服务器加载时,您是否都知道是否触发了“响应”事件。我想了解流如何工作,以及这与“数据”事件有何不同。 – codneto

+0

@codneto在接收到标题和HTTP状态之后,以及任何'数据'事件触发之前触发'响应'事件。 – idbehold

相关问题