【问题标题】:How to maintain value for every user connected inside socket events如何为在套接字事件中连接的每个用户保持价值
【发布时间】:2018-06-03 14:50:19
【问题描述】:

我有一个问题。我是nodejs的新手,所以不要判断:D。 所以让我解释一下我想做什么。 我想制作一个服务器用nodejs编写的游戏。我正在使用套接字和事件。 我的问题是:当我第一次连接到服务器时,我使用变量 currentUser 来存储当前用户的连接信息(名称特别是),但是当另一个用户连接时,currentUser 中的所有内容都会被其他用户擦除除了他。例如 3 个用户连接:aaa、bbb、ccc。当 aaa 连接时, aaa 的 currentuser 将存储名称 aaa。当 bbb 连接时, aaa 的 currentUser 中的信息被擦除并且该值未定义并且 bbb 的 currentUser 将存储名称 bbb。 ccc也是一样。 aaa 和 bbb 的 currentUser 将具有未定义的值,而 ccc 将存储名称 ccc; 有没有办法为每个用户存储名称并将其保存在 io.on("connection",) 中而不是全局?

const express=require('express');
const app=express();

const server=require('http').createServer(app);
const io=require('socket.io').listen(server);

app.set('port',process.env.PORT || 3000);

let socketUsers={};
let usersON={};

io.on("connection",function(socket){

    socket.on("CONNECTION",function(){

        socket.emit("CONNECTION_ON");

    });

    let currentUser;
    let partenerUser;

    socket.on("USER_ON",function(data){

        if(usersON[data.name]==null)
        {
            this.currentUser={
                name:data.name,
                status:data.status,
                position:"0;0;0"
            };
            process.stdout.write("User \""+data.name+"\" ,status("+data.status+") CONNECTED. \n");

            socket.emit("ONLINE_USERS",usersON);
            socket.emit("USER_OK");

            usersON[data.name]=data.status;

            socketUsers[data.name]=socket;



            socket.broadcast.emit("NEW_USER_CONNECTED",this.currentUser.name);


        }
        else
        {
            process.stdout.write("User \""+data.name+"\" ,status("+data.status+") EXISTS. \n");

            socket.emit("USER_EXISTS");

        }

    });
    socket.on("USER_SEARCH",function(data){

        console.log(this.currentUser);
        console.log(usersON);
        console.log("----------------");
        console.log(usersON[data.name]);
        console.log(data.name.toString());
        console.log(this.currentUser);
        console.log(currentUser);

       if(usersON[data.name]!=null && socketUsers[data.name]!=null && this.currentUser.name!==data.name.toString())//utilizatorul exista
       {
            console.log(usersON[data.name]);

           if(usersON[data.name]!=="OFF")
           {
               io.to(socketUsers[data.name].id).emit("USER_WANTTOPLAY",currentUser);// =? do you want to play?
               socket.emit("WAIT_RESPONSE");
           }
           else
           {
               socket.emit("USER_OFF");
           }
       }
       else
           {
           socket.emit("USER_NOTFOUND");// => INSERT OTHER username
       }
    });
    socket.on("USER_WANTTOPLAY",function(data){
        console.log("AICI");
        this.partenerUser={
            name:data.name,
            status:data.status,
            position:"0;0;0"
        }
    });
    socket.on("RESPONSE_OK",function(data){

        io.to(socketUsers[partenerUser.name].id).emit('RESPONSE_YYES');
    });
    socket.on("RESPONSE_NO",function(data){

        io.to(socketUsers[partenerUser.name].id).emit('RESPONSE_NNO');
    });
});

server.listen(app.get('port'),function(){
    console.log("=========SERVER IS RUNNING=========");
});

【问题讨论】:

    标签: javascript node.js sockets events io


    【解决方案1】:

    您的问题是您定义了变量currentUser,但没有使用它。您正在使用 this.currentUser 这不是您定义的变量。

    this 在该上下文中引用 io 对象,这对于每个连接都是相同的,这就是为什么 this.currentUser 在每个连接上都会发生变化。

    使用

    currentuser = { /* ... */ };
    

    而不是

    this.currentuser = { /* ... */ };
    

    partnerUser 也是如此。

    另一种方法是将数据直接存储在当前的 socket 对象上,并使用 Symbol

    来避免冲突
    // This will be unique to your app. Won't collide with socket.io properties
    const USER = Symbol('user'); 
    const PARTNER = Symbol('partner');
    
    io.on("connection", function(socket) {
    
      socket.on("CONNECTION", function() {
        socket.emit("CONNECTION_ON");
      });
    
      socket.on("USER_ON", function(data) {
        if (usersON[data.name] == null) {
          socket[USER] = {  // Add data to current socket.
            name: data.name,
            status: data.status,
            position: "0;0;0"
          };
        }
        /* ... */
      });
    
      socket.on("USER_SEARCH", function(data) {
        console.log(socket[USER]); // Current user
      });
    
      /* ... */
    });
    

    【讨论】:

    • 我删除了 ,, .this,, 但是是一样的。同样的错误。你的解决方案没问题,但不是我想要的。现在我确实找到了问题的原因,我正试图找出为什么会发生这种情况。因此,对于每个用户,都会建立一个连接,但我不知道为什么,当另一个用户连接时,最后一个用户会重置所有其他旧套接字。
    • 正在重置什么变量?你能具体说明一下吗。因为我的解决方案完美运行,我在多个应用程序中使用它,你可能正在做其他事情,因为如果你将数据保存到当前套接字,它不能被其他套接字覆盖。
    • 我的问题是,当新用户连接时,新套接字会重新分配给每个连接的用户。看看这个输出:imgur.com/slE4SyK。我按以下顺序为 3 个连接的用户打印了套接字 ID:aaa - 第一个,bbb- 第二个,ccc- 第三个。在所有这些都连接之后,我以相同的顺序在 USERLIST 中搜索(触发搜索事件)一个 ,,user,, (用户 ,,on,, 在服务器上)。可以看到socket.id变了,只有最后连接的用户是一样的
    • 抱歉,这个屏幕截图完全没有告诉我,你试图以不正确的方式做某事,你如何为每个连接的用户重新分配一个新的套接字,你想达到什么目的?认真正确地解释自己,并更新你的问题,我的答案是你需要的解决方案,你用错了。
    猜你喜欢
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2015-04-25
    相关资源
    最近更新 更多