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

Posted

技术标签:

【中文标题】如何将客户端的数据存储在服务器中【英文标题】:how to store client's data in the server 【发布时间】:2020-10-12 17:48:35 【问题描述】:

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

所以,如果我将客户的数据存储在 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);
  
;

这种方法比前一种方法快得多,但要做到这一点,我必须将“list”存储在服务器中。

这里的问题是当一个新用户(Let it be user1)登录时,第一个API将被调用,'find'函数将被执行,它正在执行制作“user1”的“list”。这里一切都很好

现在一个已经登录的老用户(让它成为 user2)在不同的网页中调用 API。服务器应该使用 'refreshfind' 执行'user2'的list'。但由于在'user2'调用API之前,'user1'已经登录,执行 'find' 并为 'user1' 创建了一个 'list',现在是 'list'user1' 的 >' 正在由 'user2' 调用的 API 的 'refreshfind' 更新 p>

以同样的方式在网页重新加载时从“活动用户列表”(数组)中删除用户。当网页重新加载时,socket.io 执行断开连接并使用新套接字重新连接。身份证

 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”是一组活跃用户。这个“userdata'。

所以,当我在 'user1' 网页上做某事时,会调用一个 API 和新的 'user1' 的 'userdata'将形成。到目前为止一切都很好。

现在当我重新加载 'user2' 的网页时,'user1' 将从 'users' 数组中删除删除“user2。发生这种情况是因为在“user2”重新加载他的页面之前,“user1”已经调用了一个 API 并更新了“userdata”(现在该数据属于user1

将新的登录用户添加到 'users' 数组中也会发生同样的事情

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”。到这里为止一切都很好。 em>

现在,如果我在另一个网页中以 'user2' 身份登录,'user1' 将被添加到 'users' 数组中,而不是添加“user2”。因为在 'user2' 登录之前,'user1' 已经调用了一个 API 并更新了 'userdata'(现在这个数据只属于 user1,不是针对每个用户)

【问题讨论】:

欢迎您!您能否详细说明您要做什么?还提供一个简短的代码示例来说明您当前正在做什么也可能有助于获得更快的响应。 请再看一遍我的问题,我已经更新了 【参考方案1】:

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

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

【讨论】:

以上是关于如何将客户端的数据存储在服务器中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Nuxt.js 将数据存储到本地存储

如何在数据库中存储加密的机密用户信息,需要在运行时解密?

Week3——Session

如何在客户端存储一个php数组?

可以将 session_state 存储在客户端的本地存储中吗?

我如何制作将数据存储在客户端数据库中的服务器端应用程序