Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.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
Node.js socket.io与mern stack Can';t在未安装的组件上执行React状态更新_Node.js_Reactjs_Socket.io - Fatal编程技术网

Node.js socket.io与mern stack Can';t在未安装的组件上执行React状态更新

Node.js socket.io与mern stack Can';t在未安装的组件上执行React状态更新,node.js,reactjs,socket.io,Node.js,Reactjs,Socket.io,大家好,我正在尝试使用在线/离线系统: 后端: var userCount = 0; var onlineuserList = []; io.sockets.on('connection', function (socket) { userCount++; io.sockets.emit('userCount', { userCount: userCount }); socket.on('login', function (data) { onlineuserList =

大家好,我正在尝试使用在线/离线系统:

后端:

var userCount = 0;
var onlineuserList = [];

io.sockets.on('connection', function (socket) {
  userCount++;
  io.sockets.emit('userCount', { userCount: userCount });

  socket.on('login', function (data) {
    onlineuserList = onlineuserList.filter(user=> user !== data);
    onlineuserList.push(data);

    setInterval(function(){
      io.sockets.emit('onlineuserList', onlineuserList); 
    }, 1000);
  });

  socket.on('logout', function (data) {
      onlineuserList = onlineuserList.filter(user=> user !== data)
      io.sockets.emit('onlineuserList', { onlineuserList: onlineuserList });
  });

  socket.on('disconnect', function() {
    userCount--;
    io.sockets.emit('userCount', { userCount: userCount });
  });
});
前端:

  useEffect(() => {
    socket.on('onlineuserList', (onlineuserList) => {
        if(onlineuserList.length > 0){
          onlinesetuserList(onlineuserList && onlineuserList);
          setStatus(onlineuserList && onlineuserList.includes(props.id));
        } else {
          onlinesetuserList([]);
          setStatus(false);
        }
    });

    return () => socket.off('onlineuserList', onlineuserList);
  }, []);
所有操作都只能工作,但在控制台日志中我收到以下错误: 警告:无法对已卸载的组件执行React状态更新。这是一个no-op,但它表示应用程序中存在内存泄漏。要修复此问题,请取消useEffect清理函数中的所有订阅和异步任务


还有一个问题是,在后端每秒设置setinterval是否安全可靠?

我认为问题在于,您没有为socket.off方法提供原始回调函数,因此在卸载组件时不会清理套接字侦听器

我建议进行以下修复:

useEffect(() => {
    const onlineUserListHandler = (onlineuserList) => {
        if(onlineuserList.length > 0){
            onlinesetuserList(onlineuserList && onlineuserList);
            setStatus(onlineuserList && onlineuserList.includes(props.id));
        } else {
            onlinesetuserList([]);
            setStatus(false);
        }
    }

    socket.on('onlineuserList', onlineUserListHandler);

    return () => socket.off('onlineuserList', onlineUserListHandler);
}, []);

谢谢,这解决了我的问题,您对服务器代码的看法是,每秒钟使用setinterval好吗?我问,因为请求的数量,可能会导致服务器崩溃?请检查此项:)