当客户端登录时,该客户端的数据将存储在服务器中以供进一步使用,但是当新客户端登录时,旧客户端的数据将被新客户端替换。因此,如果我将客户的数据存储在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"); });
1 回答
手掌心
TA贡献1942条经验 获得超3个赞
服务器仅适用于客户端队列中的一个客户端。当您为客户端存储变量(var 或 let)时,当新客户端到来时,这些变量将为新客户端更改。因此,您不应该在变量中存储有关客户端的任何内容
您可以使用Redis存储来自服务器的每个客户端的数据,它比 HTTP 请求更快,因此您将获得更好的性能。
添加回答
举报
0/150
提交
取消