【问题标题】:How to avoid "Can't set headers after they are sent" when cancelling a save file prompt取消保存文件提示时如何避免“发送后无法设置标题”
【发布时间】:2015-11-25 00:50:49
【问题描述】:

我有一个具有文件上传/下载功能的页面。 当我尝试下载文件 AND 取消保存文件提示时,该提示发生在 res.writeHead 部分之后,它会留下标题并等待 res.write 和 res.end 部分。

问题是,如果提示被取消,这些会被转义,从而使其他所有响应都失败,并出现错误“发送后无法设置标题”。

是否有办法以某种方式结束响应捕获已取消的提示事件,或者任何其他方式来避免这种情况?

为文件下载设置标题和流数据的部分(位于/download/:filename路由中调用的函数中)是:

res.writeHead(200, {'Content-Type': 'application/octet-stream'});
    var readstream = gfs.createReadStream({
        filename: files[0].filename
    });

    readstream.on('data', function(data){
        res.write(data);
    });

    readstream.on('end', function(){
        res.end();
    });

如果此序列未完成,则其他所有响应都会失败。

示例:

res.status(403).send('You have no access to this file');

在另一个控制器中,在同一页面中调用。 (我猜如果我重定向到另一个页面标题实际上会被清除?)

*如果我选择下载位置并按确定,则不会出现错误

*我在循环中没有双重响应,以避免这个常见的错误答案:)

【问题讨论】:

  • 您使用的是全局 res 对象吗?请给我们看一些代码
  • 请添加一些代码
  • 感谢您的回答,已更新代码

标签: node.js express mean-stack


【解决方案1】:

在快递中你可以检查res.headersSent,这样你就可以避免异常

if(res.headersSent){
  return;
} else {
  //set you headers
}

【讨论】:

  • 感谢您的快速答复。不知道有这个检查。我似乎仍然没有找到任何方法来删除 API 中的这些标头:/
  • 试试res.set(headerName, null)
  • 问题已解决。由于某种原因,当我期望只有 1 个响应时,我有一个查询要 mongo 返回超过 1 个文件。还是非常感谢:)
猜你喜欢
  • 2017-05-31
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多