当前位置: 首页 > 面试题库 >

如何在express.js中使用服务器发送事件

颛孙哲
2023-03-14
问题内容

我使用express.js设置了REST服务器。现在,我想向该服务器添加sse。实现此 sse程序包后,出现错误。我知道我收到此错误,何时尝试使用res.send两次,但我没有。

ERROR: Error: Can't set headers after they are sent.                                            
    at ServerResponse.OutgoingMessage.setHeader (http.js:690:11)                            
    at ServerResponse.header (/home/root/node_modules/express/lib/response.js:718:10)         
    at ServerResponse.send (/home/root/node_modules/express/lib/response.js:163:12)            
    at app.get.str (/home/root/.node_app_slot/main.js:1330:25)                                 
    at Layer.handle [as handle_request] (/home/root/node_modules/express/lib/router/layer.js:95:5)    
    at next (/home/root/node_modules/express/lib/router/route.js:131:13)                       
    at sse (/home/root/node_modules/server-sent-events/index.js:35:2)                          
    at Layer.handle [as handle_request] (/home/root/node_modules/express/lib/router/layer.js:95:5)  
    at next (/home/root/node_modules/express/lib/router/route.js:131:13)                          
    at Route.dispatch (/home/root/node_modules/express/lib/router/route.js:112:3)

我有可能无法在sse函数中使用express方法吗?例如:

app.get('/events', sse, function(req, res) {
    res.send('...');
});

此外,我找到了解决方案和这个。是否可以res.write在不使用其他软件包的情况下通过该函数或其他方式使用sse ?


问题答案:

如果没有其他软件包,您绝对可以实现。

我写了一篇有关此的博客文章,第1部分列出了基础知识。

您不得关闭SSE,因为这会破坏功能。关键是它是一个开放的HTTP连接。这允许在任何时候将新事件推送到客户端。



 类似资料:
  • 我有一个后端服务器,它将事件作为服务器发送的事件发送给客户端。我还没有找到一个好的库来在Android上处理这项技术,所以我一直在使用一种回退方法,定期检查服务器(通过访问事件endpoint)中的新事件。 后台服务每10秒执行一次。不用说,这不是最好的方法。如果没有任何开源库可用于此场景,那么在内存使用和电池消耗方面,定期检查服务器后端是否有新事件的最佳方法是什么?与在Android中管理开放式

  • 我到处查看,试图找出传输级别上服务器发送的事件是什么。我还是不确定。 这两个来源都声称它们“只是http”。然而,我至少可以用两种方式来解释这种说法。 当我第一次阅读这些文章时,我假设这意味着服务器在同一端口上向客户机发起请求,之前已经从客户机向服务器发出了一些其他常规http请求。这应该适用于普通家庭路由器的地址转换,但我想知道防火墙在公司环境中的含义。 然而,后来,我尝试在Silverligh

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 概述 客户端代码 概述 建立连接 open事件 message事件 error事件 自定义事件 close方法 数据格式 概述 data:数据栏 id:数据标识符 event栏:自定义信息类型 retry:最大间隔时间 服务器代码 参考链接 概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据。比如,每当收到新的电子邮件,服务器就向浏览器发送一个“

  • 我正在尝试在Ruby Grape API上创建服务器发送的事件。问题是,连接似乎总是很快关闭,因为我一直在测试网页上看到连接关闭事件。 客户端连接到服务器,因为我可以看到正在调用的方法,但我想知道为什么连接不是恒定的,为什么我没有收到我使用Thread发送的数据。 以下是我的Ruby代码: 以下是我的Javascript: 编辑:我使用GET方法实现了它(我将Grape::API更改为Sinatr

  • 我试图让服务器发送的事件与Mozilla Firefox一起工作。给定一个Spring Boot的网络服务 使用Chrome浏览器或Edge(始终是最新版本)可以正常工作。我可以在网络分析器选项卡中看到未完成的请求,并且每秒都会显示一个新的时间戳。 然而,当我使用Firefox(84.0.2或更早版本)时,请求也会显示在网络选项卡中,但不会显示响应头或流数据。当我终止Spring后端时,Firef