Javascript Node.JS Socket.IO应用程序客户端标识问题。所有客户端都显示为与上次连接的客户端具有相同的id

Javascript Node.JS Socket.IO应用程序客户端标识问题。所有客户端都显示为与上次连接的客户端具有相同的id,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我试图建立一个简单的系统,在这个系统中,我会给客户添加一些细节,比如昵称、国家等,但我偶然发现了一个关于信息注册不正确的问题 请看一下我的代码: index.js /inc/chat.js 好的,如果我启动这个简单的节点服务器,在三个不同的浏览器选项卡中打开页面而不发送任何消息,那么id似乎是正确的 但一旦我从其中一个浏览器选项卡发送消息,它就会采用最后连接的客户端id 服务器启动时,会在控制台中输出以下内容: [nodemon] starting `node index.js` /#h9s

我试图建立一个简单的系统,在这个系统中,我会给客户添加一些细节,比如昵称、国家等,但我偶然发现了一个关于信息注册不正确的问题

请看一下我的代码:

index.js /inc/chat.js 好的,如果我启动这个简单的节点服务器,在三个不同的浏览器选项卡中打开页面而不发送任何消息,那么id似乎是正确的

但一旦我从其中一个浏览器选项卡发送消息,它就会采用最后连接的客户端id

服务器启动时,会在控制台中输出以下内容:

[nodemon] starting `node index.js`
/#h9sraEo5c8uLKgczAAAA added to clients.
/#opAfZCrRa64gFsR7AAAB added to clients.
/#x-WfhClfNsLEWE85AAAC added to clients.
如果刷新第一个选项卡:

removing client:
/#x-WfhClfNsLEWE85AAAC
client list after removal:
/#x-WfhClfNsLEWE85AAAC
/#x-WfhClfNsLEWE85AAAC
/#pdlKD-v3K15_2voZAAAD added to clients.
如果我从该选项卡发送消息:

Message recieved from /#pdlKD-v3K15_2voZAAAD
如果现在切换到另一个选项卡并编写消息,服务器将输出与上面相同的消息,并更改浏览器中id的视觉表示形式

为什么连接的客户端的id会更改为上次连接的客户端的id?

I您的
套接字。在index.js中的('message')
事件上,您会从回调中获得
msg
,但您使用的是具有当前客户端的
client
。 改为使用
msg
变量,如:

   socket.on('message', function (msg) { 
        //msg holds the client
        console.log('Message recieved from ' + msg.clientId);
        socket.emit('client info', client);
    });
并从客户端发送clientId,如:

var id = socket.socket.sessionid;
socket.emit('message', {message: $(this).val(), clientId: id);

注意:此sessionid与服务器clientid不同。

问题在于,从chat.js的
第4行开始的客户端对象被重用,而没有重置detalis,从而导致数据不唯一

删除对象并从第16行开始动态生成后,chat.js解决了所有已知的关于所有id都是最后一个id的问题

以下是更新的脚本:

index.js chat.js
module.exports={
/*客户端阵列初始化*/
客户:[],
init:函数(卫星化、套接字、回调){
var init=this;
if(回调类型==“函数”){
变量客户端={
id:null,
用户名:null,
geo:null
}
client.id=socket.id;
satelize.satelize({ip:this.ip(socket)},函数(错误,有效负载){
client.geo=有效载荷;
var=null;
如果(init.clients.length>0){
对于(var i=0;i0){
log('删除后的客户端列表:');
对于(var i=0;i
该参数保存从客户端发送的实际消息,该消息可以是任何内容,在本例中是来自输入元素的字符串。我不希望从客户端传递服务器使用和id,因为这样可以操纵系统。因此,通过使用实际的套接字,我可以通过其id在阵列服务器端查找客户机详细信息。至少这是我的计划,但显然有些地方不对劲。谢谢你看,但是这是错的,对不起。它自身拥有的
msg
消息
clientid
属性。再次检查答案。我必须检查以确保msg变量只保存
#input
中的值。请参阅:
socket.emit('message',$(this.val())
如果i console.log是msg变量服务器端,它只保存表示
#input
元素值的字符串。
Message recieved from /#pdlKD-v3K15_2voZAAAD
   socket.on('message', function (msg) { 
        //msg holds the client
        console.log('Message recieved from ' + msg.clientId);
        socket.emit('client info', client);
    });
var id = socket.socket.sessionid;
socket.emit('message', {message: $(this).val(), clientId: id);
var express = require('express'),
    app = express(),
    server = require('http').Server(app),
    io = require('socket.io')(server),

    glob = require('glob'),
    path = require('path'),
    fs = require('fs'),

    satelize = require('satelize');

var chat = require(__dirname + '/inc/chat');

server.listen(8888);

app.use('/public', express.static(path.join(__dirname, 'public')));

app.get('/', function (req, res) {
    res.sendFile(__dirname + '/views/index.html');
});

io.on('connection', function (socket) {
    socket.id = chat.uniqueId();
    chat.init(satelize,socket, function () {
        var client = chat.fetchClient(socket.id);
        socket.emit('client info', client);
        socket.on('message', function (msg) {
            console.log(client.id + ' sent: ' + msg);
            socket.emit('client info', client);
        });
        socket.on('disconnect', function () {
            chat.removeClient(client);
        });
    });
});
module.exports = {

    /* client array initialization */
    clients: [],

    init: function (satelize, socket, callback) {
        var init = this;
        if (typeof callback == "function") {
            var client = {
                id : null,
                username: null,
                geo : null
            }
            client.id = socket.id;
            satelize.satelize( { ip : this.ip(socket ) }, function(error, payload) {
                client.geo = payload;
                var exists = null;
                if (init.clients.length > 0) {
                    for (var i = 0; i < init.clients.length; i++) {
                        if(init.clients[i].id == client.id) {
                            exists = client.id;
                        }
                    }
                }
                if (exists == null) {
                    init.addClient(client); 
                }
                callback();
            });
        }
    },

    /* information retrieval*/
    ip: function (socket) {
        return cleanIp(socket.handshake.address)
    },

    /* client (the user) stuff */
    addClient: function (client) {
        if (client.id !== null) {
            this.clients.push(client);
            console.log(client.id + ' added to clients.');  
        } else {
            console.log('Cannot add client: id (null)');
        }
    },
    fetchClient: function (id) {
        for (var i = 0; i < this.clients.length; i++) {
            if(this.clients[i].id == id) {
                return this.clients[i];
            }
        }
    },
    removeClient: function (client) {
        console.log('removing client: ' + client.id);
        var found = null;
        for (var i = 0; i < this.clients.length; i++) {
            if (this.clients[i] == client) {
                this.clients.splice(i,1);
                found = this.clients[i];
                break;
            }
        }
        if (this.clients.length > 0) {
            console.log('client list after removal: ');
            for (var i = 0; i < this.clients.length; i++) {
                console.log(this.clients[i].id);
            }
        } else {
            console.log('No clients in client array after last removal.');
        }
    },

    uniqueId : function() {
        function s4() {
            return Math.floor((1 + Math.random()) * 0x10000)
            .toString(16)
            .substring(1);
        }
        return s4() + s4() + '-' + s4() + '-' + s4() + s4();
    }

}

function cleanIp (ip) {
    return ip.replace('::ffff:','');
}