节点快速错误“无法在发送后设置标头”

时间:2016-04-18 21:22:35

标签: node.js express websocket

我已经阅读了有关此错误的其他问题,但我看不出任何答案如何适用于我自己的情况。我已经检查过通常的罪魁祸首 - 在调用send后我没有对响应对象做任何事情,据我所知,我的回调不会被多次调用。但无论我尝试什么,我都会收到错误“无法在发送后设置标头”。以下是我的代码示例:

return ( from a in context.Articles
         join c in context.Categories ON a.CategoryId = c.CatgegoryId
         where categoryIds.Contains( c.CategoryId ) );

对'/'的第一个请求就像一个魅力(或者似乎是这样)。但是,每次第二个请求都会导致“无法在发送标题后设置标题”。也许我不明白websocket的回调是如何关闭res对象的?它是否经常引用原始res对象?我原本以为每次请求路由都会使用新的res对象重新定义回调,但也许我错了?

这里还有其他问题。例如,如果没有收到来自websocket的响应,则永远不会返回响应,这是我计划解决的问题。此外,代码的方式现在通过websocket传递的任何第二条消息可能导致错误,但我目前正在我的本地机器上测试只有一个连接的客户端,我正在打印所有消息到控制台,可以看到在请求/响应生命周期中,只有一条消息可以通过。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

这里有很多问题。

第二个请求的问题是socket.on(...)每次调用时都会添加一个新的侦听器。因此,每个app.get(),您添加另一个socket.on()侦听器,这样它们就会堆积起来,并且每次传入的消息都会调用多个,导致多次尝试发送响应,从而导致您看到的特定错误消息。从来没有一种情况可以在请求处理程序中添加侦听器,因为每次处理请求时它们都会累积。

此外,您还有一个并发问题。如果您同时处理多个app.get('/', ...)个请求,则无法排除哪个socket.io响应与哪个Web请求相关,因此它们可能会混淆。您可能需要标记每个套接字请求,以便在响应返回时,您知道它属于哪个请求,并且您可以将响应发送到正确的请求。