当客户端登录时,该客户端的数据将存储在服务器中以供进一步使用,但是当新客户端登录时,旧客户端的数据将被新客户端替换。
因此,如果我将客户的数据存储在 var 或 let 中,则它仅属于一个特定的客户。
这样做是为了减少新API调用的加载时间,并在重新加载网页时将用户从活动用户列表中删除(因为socket.io再次使用新的socketID连接)
关于我的代码,这是我在网站启动时的第一个API调用
var list;
var find = (req, res) =>
new Promise((resolve, reject) => {
user.find({}, { _id: 1, name: 1, email: 1 }).exec(async (err, user) => {
if (err) return res.json(err);
let p = await getfulluser(req.User._id);
list = user.filter((u) => u._id != req.User._id);
for (let i = 0; i < p.messages.length; i++) {
for (var e = 0; e < list.length; e++) {
if (list[e]._id.equals(p.messages[i]._id)) {
list.splice(e, 1);
break;
}
}
}
res.json(list);
resolve(list);
});
});
这里的' for '循环很耗时,因此对于下一个API调用im使用此方法可获得更好的性能
exports.refreshfind = async (req, res) => {
if (list) {
let { id } = req.body;
for (let e = 0; e < list.length; e++) {
if (list[e]._id.equals(id)) {
list.splice(e, 1);
res.json(list);
break;
}
}
} else {
await find(req, res);
}
};
此方法比以前的方法快很多,但是要做到这一点,我必须将“ 列表”存储在服务器中。
这里的问题是,当新用户(以 user1 )登录时,将调用第一个API,将执行“ 查找”功能,来创建“ user1 ”的“ 列表”。这里一切都很好
现在,一个已经登录过的老用户(让它成为 user2 )在另一个网页中调用API。服务器应使用' refreshfind list ”,但自<< strong> user2 ”调用API之前,“ user1 ”已登录,执行“ 查找”,并为“ 用户1 ”创建了“ 列表”,现在又知道了“ 列表 user1 ”的“>”正由“ user2 ” 调用的API的“ 刷新” >
以相同的方式在重新加载网页时从“ 活动用户列表”(数组)中删除用户。当重新加载网页时,socket.io执行断开连接并与新的套接字重新连接。 ID
socket.on("disconnect", ()...
因此,删除重新加载其页面的用户的功能是
var userdata = require("./controllers/user");
socket.on("disconnect", () => {
if (userdata !== undefined && users !== undefined) {
for (e = 0; users.length; e++) {
if (users[e].userid === userdata.userdata._id) {
users.splice(e, 1);
break;
}
}
}
console.log(users);
console.log("disconnected");
});
此处“ 用户数据”仅是为此目的存储的一个用户数据,“ 用户”是一组活动用户。该“ 用户数据<每当该用户调用API时,中间件就会频繁地调用和导入/ strong>。
因此,当我在' user1 '网页中进行操作时,将调用一个API,并且新的' user1 '的 userdata 将会形成。到目前为止一切都很好。
现在,当我重新加载' user2 '的网页时,' user1 '将从' users '数组中删除删除“ user2 ” 。发生这种情况的原因是,在“ user2 ”重新加载页面之前,“ user1 ”已调用API并更新了“ userdata ”(现在此数据属于仅 user1 )
发生了同样的事情,将新的登录用户添加到“ 用户”数组中
var userdata = require("./controllers/user");
socket.on("done", () => {
console.log("connected");
console.log(`u data ${JSON.stringify(userdata)}`);
users.push({ userid: userdata.userdata._id, socketid: socket.id });
console.log(users);
});
当我在“ user1 ”中执行某项操作时,将调用一个API并更新“ userdata ”。在这里一切都很好。
现在,如果我以“ user2 ”的身份登录其他网页,则会将“ user1 ”添加到“ 用户”数组中,而不是添加“ user2 ”。因为在“ user2 ”登录之前,“ user1 ”已调用API并更新了“ userdata ”(现在此数据仅属于 user1 ,而不是针对每个用户)
答案 0 :(得分:1)
服务器仅适用于客户端队列中的一个客户端。当您为客户端存储变量(var或let)时,以及新客户端出现时,这些变量将为新客户端更改。因此,不应在变量中存储与客户端有关的任何内容
您可以使用 Redis 从服务器存储每个客户端的数据,它比HTTP请求的速度更快,因此您将获得更好的性能。