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好吗?我问,因为请求的数量,可能会导致服务器崩溃?请检查此项:)