在 io 侦听器之外修改 socket.data 属性 - socketio

modify socket.data attribute outside of io listener - socketio

所以我一直在创建一个简单的聊天应用程序,并且我使用的是更新的 socket.io 版本,特别是 socket.io@4.4.1,它可以访问 socket.data,这真的很有帮助,但我一直在尝试应用它。我查看了文档,但我发现的最好的是: socket.data docs

代码布局是这样的:

function loginuser(socket, username,password){
if (authenticated()) {
    socket.data.loggedin = true
  }else{
    console.log("fail")
  }
}

而 io.on 是这样的:

io.on("connection", (socket) => {
socket.data.loggedin = false

socket.on('login', function(data) {
console.log("logged in?: "+ JSON.stringify(socket.data.loggedin))
if(!socket.data.loggedin){
  loginuser(socket, data.username, data.password)
  //should return true here afterwards in socket.data.loggedin, but it doesn't
}else{
  console.log("logged in already")
}
});

所以我试图通过套接字,我 认为 这样我就可以更改它的所有部分,而不仅仅是功能。有没有人做过更简单的事情,甚至让我知道这是否可能?如果没有,还有哪些其他选择?

类似的内容可能适合您。

function loginuser(socket, username, password) {
  if (authenticated()) {
    return true;
  }

  return false;
}

io.on("connection", (socket) => {
  socket.data.loggedin = false;

  socket.on('login', function(data) {
    if (socket.data.loggedin === false && (socket.data.loggedin = loginuser(socket, data.username, data.password)) === false) {
      console.log("Failed to log in.");
    } else {
      console.log("The user is logged in.");
    }
  });
});

在上面的示例中,在新连接上,socket.data.loggedin 属性 的默认值为 false。 如果套接字发出 login 事件,则执行以下操作:

  1. 检查 socket.data.loggedin 属性 的值是否等于 false。如果它不等于 false,我们跳转到 else 块,我们的用户已登录。如果条件是 false,我们转到第二步。
  2. 我们将socket.data.loggedin 属性的值赋值给loginuser函数的return值,并检查新赋值是否等于false.如果是false,那么用户没有登录,也无法登录。如果新值为 true,我们跳转到 else 块,因为我们的用户已成功登录。