javascript - 如何维护套接字事件内连接的每个用户的值(value)

标签 javascript node.js sockets events io

我有一个问题。我是 Nodejs 新手,所以不要评判:D。 那么让我解释一下我想做什么。 我想做一个游戏,服务器是用nodejs编写的。我正在使用套接字和事件。 我的问题是这样的:当我第一次连接到服务器时,我使用变量 currentUser 来存储当前用户连接信息(名称特别是),但是当另一个用户连接时,除他之外的所有其他用户, currentUser 中的所有内容都会被删除。例如 3 个用户连接:aaa、bbb、ccc。当 aaa 连接时,aaa 的当前用户将存储名称 aaa。当 bbb 连接时,aaa 的 currentUser 中的信息将被删除,并且该值未定义,并且 bbb 的 currentUser 将存储名称 bbb。 ccc 也一样。 aaa 和 bbb 的 currentUser 将具有值 undifined,而 ccc 的 currentUser 将存储名称 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=========");
});

最佳答案

您的问题是您定义了变量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
  });

  /* ... */
});

关于javascript - 如何维护套接字事件内连接的每个用户的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50667652/

相关文章:

javascript - 正则表达式计算不包括 html 标签的单词

node.js - Mongoose .find 字符串参数

node.js - 羽毛 js 中的关联查询

javascript - Socket.io 在 ES6 类中发出值

javascript - 在JQuery弹出关闭按钮上调用JS 'X'

javascript - 如何传递元素onclick?

javascript - 每 15 秒制作一个充满的酒吧

javascript - Handlebars 模板呈现为原始 html

node.js - socket.io:高流量时出现错误请求错误

c - 在同一端口上接收多个多播提要 - C、Linux