【问题标题】:SocketId is changed after saving it to databaseSocketId 保存到数据库后更改
【发布时间】:2017-06-25 06:08:08
【问题描述】:
io.on('connection',function(socket){
   socket.emit('online');
   users.findOne({'username':session.username},function(err,user){
   console.log("UPDATING THE CURRENT SOCKEDID ie ! "+" socketidfromDB :  
   "+user.callsession.socketid+"    to cureent socketid :  "+socket.id);
   user.callsession.socketid=socket.id;
   user.save();
});

当我尝试在 socketio 的连接上运行这段代码时,这会自动运行两次并最终将错误的 socketId 保存到数据库。存储的socketId不是当前的socketId,它是别的东西。

发生了什么?

【问题讨论】:

  • 您不应该将socket.id 保存在数据库中,因为它会在客户端连接到服务器时发生变化。
  • @MukeshSharma 我正在尝试实现像 Hangouts 这样的呼叫系统,我需要将 socketid 存储到数据库中以便与用户建立呼叫连接,
  • 用户断开一段时间后重新连接的情况如何?
  • @MukeshSharma 这不是问题,因为我每次连接时都会更新用户的 socketid。你有没有更好的方法来做到这一点? -
  • 是的,您可以将其保存在某些缓存/系统内存中,而不是保存在 mongodb 中,以获得更好的延迟。

标签: node.js express mongoose socket.io


【解决方案1】:

最好通过套接字在数据中传递会话令牌。您可以轻松跟踪各个会话的所有通信。很难在套接字 id 上进行中继,这增加了不必要的复杂性。

【讨论】:

  • 但是我如何才能与特定的套接字客户端进行通信?
  • 您始终可以按照您当前的连接方式连接到套接字客户端。我提议的是,每当您通过套接字客户端传递任何数据模型时,向您的数据 json 添加一个属性,该属性包含唯一标识用户的会话 ID 或令牌。并中继该令牌而不是套接字 ID。
猜你喜欢
  • 2011-10-26
  • 2012-07-07
  • 2016-04-09
  • 2014-07-08
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
相关资源
最近更新 更多