我在heroku上托管了一个node / express应用程序。它有一个GET路由,可以下载zip文件:
export function downloadData(req, res, next) {
const archive = archiver('zip');
const archiveName = 'archive.zip';
res.setHeader('Content-disposition', `attachment; filename*=UTF-8''${archiveName}; filename=${archiveName}`);
res.setHeader('Content-type', 'application/zip');
res.setHeader('Connection', 'close');
archive.pipe(res);
// add content to archive
_.map(getData(), entry => {
const { nameInArchive, path } = entry;
const fileReadStream = Storage.getFileStream(path);
archive.append(fileReadStream, { name: nameInArchive });
});
res.on('error', (err) => {
// handle error
});
res.on('finish', () => {
// This is triggered when the download has finished.
});
res.on('close', () => {
// This is triggered when the download is canceled by user/browser.
});
archive.finalize();
}
效果很好,但有一点很奇怪:
当用户在浏览器中取消正在运行的下载时,会触发close
事件(如预期的那样)。
但是,当用户开始新的下载(相同或其他数据)时,控制器会再次被触发,但没有任何内容流式传输到浏览器。
可能是第一个连接仍处于活动状态(虽然它已被取消)并且它会停止进一步的请求吗? 关闭服务器连接的正确方法是什么?
我尝试在响应中设置res.setHeader('Connection', 'close')
,但浏览器仍会收到Connection: keep-alive
的响应(我猜这是默认的heroku)。
任何帮助表示赞赏: - )