我已经阅读了有关此错误的其他问题,但我看不出任何答案如何适用于我自己的情况。我已经检查过通常的罪魁祸首 - 在调用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传递的任何第二条消息可能导致错误,但我目前正在我的本地机器上测试只有一个连接的客户端,我正在打印所有消息到控制台,可以看到在请求/响应生命周期中,只有一条消息可以通过。非常感谢任何帮助!
答案 0 :(得分:1)
这里有很多问题。
第二个请求的问题是socket.on(...)
每次调用时都会添加一个新的侦听器。因此,每个app.get()
,您添加另一个socket.on()
侦听器,这样它们就会堆积起来,并且每次传入的消息都会调用多个,导致多次尝试发送响应,从而导致您看到的特定错误消息。从来没有一种情况可以在请求处理程序中添加侦听器,因为每次处理请求时它们都会累积。
此外,您还有一个并发问题。如果您同时处理多个app.get('/', ...)
个请求,则无法排除哪个socket.io响应与哪个Web请求相关,因此它们可能会混淆。您可能需要标记每个套接字请求,以便在响应返回时,您知道它属于哪个请求,并且您可以将响应发送到正确的请求。