如何为套接字事件内连接的每个用户维护价值



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

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

最新更新