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

我有一个具体的问题,错误“发送后无法设置标题”。

代码是这样的:

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 

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

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

在此先感谢,伙计们!

最有可能的是你正在接收多个成功的“消息”,所以它多次调用response.json()

你可以通过将on('message')改为once('message')来解决这个问题,这样事件处理程序只执行一次。 但是,如果这一条消息不成功,则不会发送响应。 所以你可能需要为你的if (result.code === 'success')添加一个else 或者留下on('message')并引入一些防范variables,这样if中的代码只能执行一次。