Javascript SSE服务器在几次尝试后停止响应
当我尝试在express上执行SSE时,每次尝试5次后,服务器都会停止响应。 我希望它能无限期地正常工作 如果我在一段时间后离开页面,则会出现以下错误: “POST net::ERR\u EMPTY\u响应” 在服务器上: “MaxListenerSexceedAwarning:可能的事件发射器 检测到内存泄漏。向[EventEmitter]添加了11个消息侦听器。 使用emitter.setMaxListeners()增加限制“ 这两个错误不会立即出现 我试着改变标题和发送不同的状态,但没有任何效果,除了打破平衡的工作 一般来说,我对表达和节点都是相当陌生的,我真的不知道我在这里做错了什么 我的服务器设置如下:Javascript SSE服务器在几次尝试后停止响应,javascript,node.js,reactjs,express,server-sent-events,Javascript,Node.js,Reactjs,Express,Server Sent Events,当我尝试在express上执行SSE时,每次尝试5次后,服务器都会停止响应。 我希望它能无限期地正常工作 如果我在一段时间后离开页面,则会出现以下错误: “POST net::ERR\u EMPTY\u响应” 在服务器上: “MaxListenerSexceedAwarning:可能的事件发射器 检测到内存泄漏。向[EventEmitter]添加了11个消息侦听器。 使用emitter.setMaxListeners()增加限制“ 这两个错误不会立即出现 我试着改变标题和发送不同的状态,但没有任
app.get(“/api/update”,(请求、恢复、下一步)=>{
资源状态(200)。设置({
“内容类型”:“文本/事件流;字符集=utf-8”,
“缓存控制”:“无缓存,无转换”,
“传输编码”:“分块”,
连接:“保持活力”
});
app.on(“消息”,数据=>{
res.write(`data:${JSON.stringify(data)}\n\n`);
});
});
app.post(“/api/update)”,(请求、回复、下一步)=>{
const message=req.body.type;
app.emit(“消息”{
标题:“更新”,
消息
时间戳:新日期()
});
});
我的客户可以这样近似:
import React,{Component}来自“React”;
类按钮扩展组件{
source=新事件源(“api/更新”);
messageHandler=事件=>{
console.log(事件数据);
};
componentDidMount=()=>{
this.source.onmessage=this.messageHandler;
};
渲染=()=>(
{
获取(“/api/update”{
方法:“张贴”,
标题:{
接受:“应用程序/json”,
“内容类型”:“应用程序/json”
},
正文:JSON.stringify({type:“button”})
});
}}
/>
);
}
导出默认按钮;
此部分:
class Button extends Component {
source = new EventSource("api/update");
原因是:一次最多可以同时连接5或6个EventSource。
()
通常,在每次渲染时都会打开新的EventSource,而不会关闭旧的渲染。每次渲染都会打开新实例。在旧连接关闭之前,不应打开新连接
我使用这种方法:
1.将EventSource侦听器存储在useRef中,该侦听器保存在所有渲染中。
2.在listen函数上使用callback
const evtSrc = useRef(null)
const listenEvt = useCallback(() => {
if (!evtSrc.current) {
evtSrc.current = new EventSource("api/update");
}
}, [])
希望这有帮助 我设法解决了这个问题:我在向服务器发送邮件时忘记关闭连接。 这:
app.post(“/api/update”,(请求、回复、下一步)=>{
const message=req.body.type;
app.emit(“消息”{
标题:“更新”,
消息
时间戳:新日期()
});
});
变成这样:
app.post(“/api/update”,(请求、回复、下一步)=>{
const message=req.body.type;
app.emit(“消息”{
标题:“更新”,
消息
时间戳:新日期()
});
res.end();
});
我应该将onmessage方法放在哪里?在evtSrc.current=neweventsource(“api/update”)之后插入useCallback钩子代码>?是的,在该函数中定义了所有EventSource方法。我成功地解决了该问题,但不幸的是没有使用此答案:我注意到,在发布到服务器时,我只是忘记关闭连接。问题出在服务器端,而不是客户端。您所说的重新呈现在类组件中是不正确的,而仅在函数组件中是正确的。谢谢你抽出时间回答我的问题。
useEffect(() => {
listenEvt() // componentDidMount
return () => evtSrc.current.close() // componentDidUnmount
}