Как сохранить значение для каждого пользователя, подключенного внутри событий сокета - PullRequest
0 голосов
/ 03 июня 2018

У меня есть вопрос.Я новичок в nodejs, так что не судите: D.Итак, позвольте мне объяснить, что я хочу сделать.Я хочу сделать игру, где сервер написан на nodejs.Я использую сокеты и события.У меня такой вопрос: когда я впервые подключаюсь к серверу, я использую переменную currentUser для хранения информации, связанной с текущим пользователем (имя espacialy), но когда подключается другой пользователь, все, что находится внутри currentUser, стирается для всех остальных пользователей.кроме него.Например подключается 3 пользователя: aaa, bbb, ccc.Когда aaa подключается, currentuser для aaa сохранит имя aaa.Когда bbb соединяется, информация в currentUser для aaa стирается, а значение остается неопределенным, а currentUser для bbb будет хранить имя bbb.То же самое для ccc.currentUser для aaa и bbb будет иметь неопределенное значение, а для ccc будет хранить имя ccc;Есть ли способ сохранить имя для каждого пользователя и сохранить его внутри io.on («соединение»,), а не глобально?

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=========");
});

1 Ответ

0 голосов
/ 03 июня 2018

Ваша проблема в том, что вы определяете переменную currentUser, но не используете ее.Вы используете this.currentUser, который не является переменной, которую вы определили.

this в этом контексте ссылается на io объект, который одинаков для каждого соединения, поэтому this.currentUser меняетсякаждое соединение.

использовать

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

вместо

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

И то же самое относится к partnerUser.

Альтернативой является хранениеданные непосредственно на текущем socket объекте, и во избежание коллизий используйте символ

// 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
  });

  /* ... */
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...