我有一些存储在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);
});
我面对上述方法的问题是:
res
的方法
request
的对象不会删除这些标头。它通过那些
标题是响应。我想删除这些标题。 我尝试将其更改为以下内容:
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,它确实会对响应时间造成不利影响。
所以我的问题是 - 有没有办法在开始发送响应之前不必等待整个文件在服务器端下载,但仍然可以操作响应头?
答案 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)
})