node.js - 带有 mern 堆栈的 socket.io 无法对未安装的组件执行 React 状态更新
问题描述
大家好,我正在尝试使用在线/离线系统:
后端:
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 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要解决此问题,请在 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);
}, []);
推荐阅读
- python - Pandas 根据条件为每一行创建一个唯一的 id
- mysql - 如何使用 LEFT JOIN 查找表中是否缺少数据
- python - 如何在没有透明部分的情况下获得 pygame Surface 的矩形?
- node.js - 在 nodejs 中,有没有办法让我始终可以使用一个模块?
- ansible - 为一组主机变量中的每个唯一值运行导入的 Ansible 剧本
- java - JavaFX AudioClip MEDIA_UNSUPPORTED:无法识别的文件签名,更新不推荐使用的代码
- r - 将向量列表中的所有向量元素设置为 NA
- vagrant - 您可以从 VM 内部执行 vagrant 配置吗?
- python - PCA 中的行与列有多重要?
- google-sheets - 是否有一个函数可以创建一个扩展数组公式,根据多个条件有条件地对一列求和?