当客户端登录时,该客户端的数据将存储在服务器中以供进一步使用,但是当新客户端登录时,旧客户端的数据将被新客户端替换。
因此,如果我将客户的数据存储在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调用,我使用这个方法来获得更好的性能
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 将被调用,' find ' 函数将被执行,它将生成 ' user1 ' 的 ' list '。这里一切都很好
现在一个已经登录的老用户(假设它是user2)在不同的网页中调用 API。服务器应该使用“user2”的“list”执行“refreshfind” 。但是因为在“ user2 ”调用 API 之前, “ user1 ”已登录,执行“ find ”并为“ user1 ”创建了一个“ list ” ,现在“ user1 ”的“ list ”正在由“ user2 ”调用的 API的“ refreshfind ”更新
以同样的方式在网页重新加载时从“活动用户列表”(数组)中删除用户。当网页重新加载时,socket.io 执行断开连接并使用新的 socket.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");
});
手掌心
相关分类