仅在第一次请求后发送标题后才能设置标题

时间:2016-02-01 01:05:29

标签: javascript node.js express coffeescript

我遇到了错误的特定问题"在发送标题后无法设置标题"。

代码就是这个:

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));
  }

先谢谢你,伙计们!

1 个答案:

答案 0 :(得分:2)

最有可能发生的事情是您收到多条成功的“消息”,因此它多次调用response.json()

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