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

我用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('...'); }); 

此外,我find了这个解决scheme。 是否有可能用res.write函数或另一种方式使用另一种方法,而不使用另一个包?

你绝对可以做到这一点,没有其他的包。

我写了一篇关于这个的博客文章,第一部分介绍了基础知识。

从你正在使用的库的文档看来,你应该使用res.sse作为一个函数的中间件。 请参阅: https : //www.npmjs.com/package/server-sent-events

但是,所有这些实际上是从他们的代码中做的,正如你所提到的,它正在封装res.write 。 请参阅: https : //github.com/zacbarton/node-server-sent-events/blob/master/index.js#L11

自我推销:我写了一个ExpreSSE软件包,提供中间件和SSE一起工作,你可以在npm: @ toverux / expresse上find它。

一个简单的例子:

 router.get('/events', sse(/* options */), (req, res) => { let messageId = parseInt(req.header('Last-Event-ID'), 10) || 0; someModule.on('someEvent', (event) => { //=> Data messages (no event name, but defaults to 'message' in the browser). res.sse.data(event); //=> Named event + data (data is mandatory) res.sse.event('someEvent', event); //=> Comment, not interpreted by EventSource on the browser - useful for debugging/self-documenting purposes. res.sse.comment('debug: someModule emitted someEvent!'); //=> In data() and event() you can also pass an ID - useful for replay with Last-Event-ID header. res.sse.data(event, (messageId++).toString()); }); }); 

还有另一个中间件将相同的事件推送给多个客户端。