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

时间:2020-06-22 19:01:16

标签: javascript node.js express socket.io webserver

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

因此,如果我将客户的数据存储在 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 ,而不是针对每个用户)

1 个答案:

答案 0 :(得分:1)

服务器仅适用于客户端队列中的一个客户端。当您为客户端存储变量(var或let)时,以及新客户端出现时,这些变量将为新客户端更改。因此,不应在变量中存储与客户端有关的任何内容

您可以使用 Redis 从服务器存储每个客户端的数据,它比HTTP请求的速度更快,因此您将获得更好的性能。