【问题标题】:Can't set headers after they are sent after first request only仅在第一次请求后发送标头后无法设置标头
【发布时间】:2016-05-09 09:01:36
【问题描述】:

我遇到了“发送后无法设置标头”错误的具体问题。

代码是这个:

create: (request, response, next) ->
socket = @app.socket

#
# This method will be used to call the right method inside
# the emails service.
data = JSON.stringify(
  Object.assign request.body.data, method: 'server'
)

socket.send data

socket.on 'message', (result) =>
  result = JSON.parse(
    result.toString()
  )

  if result.code is 'success'
    @model.insertAsync request.body
      .then (result) ->
        response.json data: result
        return
      .catch next
    return
return

我正在使用两台服务器和套接字连接在它们之间进行通信。当我想创建一封电子邮件时,我向其他服务器发送一条消息并等待结果,如果结果是“成功”,我将数据发回(我使用的是 Ember,所以我需要在保存后发送数据)。现在的问题:当我第一次发送电子邮件时一切正常,当我第二次尝试时,我的终端中显示一条错误消息:

Error: Can't set headers after they are sent.

按照表达,错误在这一行:

response.json data: result

或在 JS 中:

response.json({data: result});

纯JS中的代码:

create: function(request, response, next) {
    var data, socket;
    socket = this.app.socket;
    data = JSON.stringify(Object.assign(request.body.data, {
      method: 'server'
    }));
    socket.send(data);
    socket.on('message', (function(_this) {
      return function(result) {
        result = JSON.parse(result.toString());
        if (result.code === 'success') {
          _this.model.insertAsync(request.body).then(function(result) {
            response.json({
              data: result
            });
          })["catch"](next);
        }
      };
    })(this));
  }

提前谢谢各位!

【问题讨论】:

    标签: javascript node.js express coffeescript


    【解决方案1】:

    很可能发生的情况是您收到了不止一条成功的“消息”,因此它多次调用response.json()

    您可以通过将on('message') 更改为once('message') 来解决此问题,以便事件处理程序只执行一次。但是,如果该消息不成功,则不会发送响应。因此,您可能需要将else 添加到您的if (result.code === 'success') 离开on('message') 并引入某种保护变量,以便if 中的代码只执行一次。

    【讨论】:

    • 是的,这就是问题所在,我修复了一次。如果你不介意,你知道为什么会这样吗?我觉得太奇怪了..
    • 这是因为response.json() 直接或间接地尝试写入标题(和正文)。 HTTP 只允许对一个请求进行一个响应(一组标头)。
    • 是的,我理解这个概念,我觉得奇怪的是,如果我只发送一条消息,为什么我的其他服务器会响应两次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多