猿问

如何将客户端的数据存储在服务器中

当客户端登录时,该客户端的数据将存储在服务器中以供进一步使用,但是当新客户端登录时,旧客户端的数据将被新客户端替换。


因此,如果我将客户的数据存储在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的猫
浏览 101回答 1
1回答

手掌心

服务器仅适用于客户端队列中的一个客户端。当您为客户端存储变量(var 或 let)时,当新客户端到来时,这些变量将为新客户端更改。因此,您不应该在变量中存储有关客户端的任何内容您可以使用Redis存储来自服务器的每个客户端的数据,它比 HTTP 请求更快,因此您将获得更好的性能。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答