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

how to store client's data in the server

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

因此,如果我将客户的数据存储在 varlet 中,它只属于一个特定的客户。

我这样做是为了减少新 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);
  }
};

此方法比前一个方法快很多,但为此我必须将“列表”存储在服务器中。

Here the problem is when a new user(Let it be user1) logs in,first API will be called, 'find' function will be executed, it's going to make 'list' of 'user1'.Everything is fine here

Now an old user,who has already loggedin(Let it be user2) calls an API in a different web page.Server should execute 'refreshfind' using the 'list' of 'user2'.But since before 'user2' calling an API, 'user1' has loggedin, executed 'find' and made a 'list' for 'user1', now that 'list' of 'user1' is being updated by 'refreshfind' of an API which was called by 'user2'

以相同的方式从'活动用户列表'(数组)中删除用户,当网页reloads.When 网页重新加载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");
  });

这里的'userdata'只是为了这个目的而存储的一个用户的数据,而'users'是一组活跃的users.This 'userdata' 被中间件频繁调用和导入,每当该用户调用 API 时。

So, when I do something in 'user1' webpage, an API will be called and new 'userdata' of 'user1' will be formed.Everything is fine till now.

Now when I reload the webpage of 'user2', 'user1' will be deleted from 'users' array instead of deleting 'user2'. This happens because before 'user2' reloaded his page, 'user1' had called an API and updated 'userdata'(now this data belongs to user1 only)

将新登录用户添加到“用户

数组时发生同样的事情
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);
  });

When i do something in 'user1', an API will be called and 'userdata' will be updated.Everything is fine till here.

Now if I login as 'user2' in a different webpage, 'user1' will be added into 'users' array instead of adding 'user2'. Because before 'user2' logged in, 'user1' had called an API and updated 'userdata'(now this data only belongs to user1, not for every user)

服务器仅适用于客户端队列中的一个客户端。当您为客户存储变量(var 或 let)时,当新客户到来时,这些变量将因新 client.So 而改变,您不应该在变量 [=10= 中存储任何关于客户的信息]

你可以使用Redis来存储每个客户端从服务器端的数据,它比HTTP请求更快,所以你会得到更好的性能。