Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript SSE服务器在几次尝试后停止响应_Javascript_Node.js_Reactjs_Express_Server Sent Events - Fatal编程技术网

Javascript SSE服务器在几次尝试后停止响应

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()增加限制“ 这两个错误不会立即出现 我试着改变标题和发送不同的状态,但没有任

当我尝试在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");
  }
 }, [])
  • 然后,您要求使用useEffect钩子在装载上创建新的EventSource连接,并在每次卸载时将其关闭:

  • 希望这有帮助

    我设法解决了这个问题:我在向服务器发送邮件时忘记关闭连接。 这:

    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
        }