當客戶端登錄時,該客戶端的數據將存儲在服務器中以供進一步使用,但是當新客戶端登錄時,舊客戶端的數據將被新客戶端替換。因此,如果我將客戶的數據存儲在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"); });
如何將客戶端的數據存儲在服務器中
一只名叫tom的貓
2022-10-13 16:27:47