【问题标题】:Node.js : throw new Error('Can\'t set headers after they are sent.');Node.js : throw new Error('Can\'t set headers after they are sent.');
【发布时间】:2016-02-11 16:24:47
【问题描述】:

我在搜索了有关此错误的所有现有主题后写了这篇文章。毫无疑问,它对我理解这个错误有很大帮助,但不幸的是,我无法解决我的问题。我想将从 Angular 应用程序生成的 pdf 文件上传到我的服务器,我正在关注 this 代码。最初我收到错误,因为“XMLHttpRequest 无法加载。请求的资源上不存在 'Access-Control-Allow-Origin' 标头。因此不允许访问 Origin 'http://localhost:8080'。”

为了解决这个问题,我使用以下代码在 c:/wamp/www/ 位置创建 .htaccess 文件。 (注意——我使用的是 WAMP 服务器)

`

<FilesMatch "\.(ttf|otf|eot|woff|jpg|png|jpeg|gif|js|json|html|css|pdf)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

现在我遇到以下错误:

_http_outgoing.js:335
    throw new Error('Can\'t set headers after they are sent.');
          ^
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
    at ServerResponse.header (C:\node_apps\pp_app\node_modules\express\lib\respo
nse.js:718:10)
    at ServerResponse.send (C:\node_apps\pp_app\node_modules\express\lib\respons
e.js:163:12)
    at IncomingForm.<anonymous> (C:\node_apps\pp_app\index.js:18:25)
    at IncomingForm.emit (events.js:129:20)
    at IncomingForm._maybeEnd (C:\node_apps\pp_app\node_modules\formidable\lib\i
ncoming_form.js:553:8)
    at C:\node_apps\pp_app\node_modules\formidable\lib\incoming_form.js:230:12
    at WriteStream.<anonymous> (C:\node_apps\pp_app\node_modules\formidable\lib\
file.js:70:5)
    at WriteStream.g (events.js:199:16)
    at WriteStream.emit (events.js:129:20)

出现此错误后,节点服务器结束,因此我在应用程序控制台上得到 net::ERR_CONNECTION_RESET。我知道我做错了什么,但由于我是 node.js 和 express.js 的新手,所以无法理解它在哪里以及如何做。

你能帮忙吗!

客户端和服务器端代码:https://jsfiddle.net/0paL9bfb/5/

仅供参考-文件已上传到服务器上的临时文件夹中,但类型是“文件”而不是“pdf”,并且图像在 pdf 中未正确呈现。添加的文本渲染良好。

【问题讨论】:

  • Can\'t set headers after they are sent. 仅表示您发送响应标头,如 res.end() 或类似 more 不止一次,这显然是不正确的。
  • @loadaverage :但是在我的代码中,我没有多次使用响应标头。它只有一次...“res.status(200).send("thank you");"让我很困惑如何解决它。

标签: node.js pdf express file-upload


【解决方案1】:

似乎一切正常。试试这个演示

ClientServer

顺便说一句,这个files.pdf.name 很危险:)

【讨论】:

  • 感谢@loadaverage。但是上传到服务器的 pdf 不会渲染图像。文本来得很好。我知道这与我昨天发布的问题不同,但只是询问您是否有任何想法。本地机器上的 PDF 渲染良好。
  • 更新的客户端和服务器代码供您参考:jsfiddle.net/L09jnmbn/1
  • 啊..我发现 var data = doc.output("blob");成功了。能够在服务器上成功保存生成的pdf,但是第二次做同样的事情[意味着调用createPdf()来生成另一个pdf],再次给了我_http_outgoing.js:335 throw new Error('Can\'t set headers after他们被发送了。');
  • 我认为这是客户端(pdf lib)上的一些不正确的东西,因为你看到 - 服务器端没问题
  • 是的...正在尝试修复它。感谢您的宝贵时间。
【解决方案2】:

您可以向 Express 添加一个中间件来添加这些标头:

在您的服务器文件中:

(在您的 JsFiddle 中,这在第 43 行。)

app.use(function (req, res, next) {
  var pattern = /.(ttf|otf|eot|woff|jpg|png|jpeg|gif|js|json|html|css|pdf)/
  if (pattern.test(req.url)) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
    res.setHeader('Access-Control-Allow-Credentials', true);
  }
  next();
});

这将查看所有传入的请求,如果请求包含提供的正则表达式,则添加 CORS 标头。

然后您可以删除 .htaccess 文件。

【讨论】:

  • 谢谢@Mikko Tormala
猜你喜欢
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多