Node.js:抛出新的错误('在发送之后不能设置标题。');

时间:2016-02-11 00:16:55

标签: node.js pdf express file-upload

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

要解决此问题,我使用以下代码在c:/ wamp / www / location上创建.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>
&#13;
&#13;
&#13;

现在我收到以下错误:

_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/

FYI-文件上传到服务器上的临时文件夹中,但类型为&#39; file&#39;而不是&#39; pdf&#39;并且图像在pdf中不能正确呈现。添加的文本正常呈现。

2 个答案:

答案 0 :(得分:0)

您可以向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文件。

答案 1 :(得分:0)

似乎一切都好。试试这个演示

ClientServer

不过,这个files.pdf.name很危险:)