heroku上的Node / Express应用程序:如何关闭已取消的请求

时间:2018-06-08 12:33:14

标签: node.js express heroku

我在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)。

任何帮助表示赞赏: - )

0 个答案:

没有答案