如何findnode.js websocket消息的连接?

我正在为node.js websocket聊天服务器写下面的代码,并想知道conn的variables生存期问题是什么。

 // chat-server.js // Joshua Marshall Moore // 12/20/2010 var ws = require("../../lib/ws/server"); var server = ws.createServer(); conns = []; server.addListener("connection", function(conn){ function runHandler(msg){ server.broadcast(JSON.stringify({"who": conns[conn], "when": Date.now(), "what": msg})); } function setupHandler(msg){ if(conns.indexOf(msg)==-1 && msg!="Server"){ // name has not been taken yet conns[conn] = msg; conn.send("name ok"); server.broadcast(JSON.stringify({ "who": "Server", "when": Date.now(), "what": msg + " has joined us" })); conn.removeListener("message": setupHandler); conn.addListener("message": runHandler); return; } conn.send("name taken"); } conn.addListener("message", setupHandler); }); server.addListener("close", function(conn){ server.broadcast(JSON.stringify({ "who": "Server", "when": Date.now(), "what": conns[conn] + " has left us." })); delete conns[conn]; }); server.listen(16007); 

上面的代码将运行。 服务器连接,提交一个名称,直到服务器说没关系。 从客户端发送到服务器的任何消息被中继到所有客户端。

我试图使用连接作为关键,以便以后检索客户端提交的名称。 但是,当第二个客户端连接时,所有消息都显示为来自最后一个要连接的人。

我希望这里有人对connvariables的整个生命周期都有一些了解。 从它的外观来看,conn是为服务器连接事件注册的匿名函数的本地。 因此,这个匿名函数内部定义的函数本身就可以访问conn。

我更具体的问题是:每次build立新连接时都会调用匿名函数。 这是否意味着每次发生这种情况,函数setupHandler和runHandler都会使用conn的副本对应于他们被调用的新连接,还是有机会互相混合呢?

@Ivo是正确的事实,你不能使用对象作为关键。

但是,正如你所指出的那样,问题是肯定的。 setupHandler中的conn是最后连接的客户端。 你为什么不这样做?

 server.addListener("connection", function(conn){ conn.addListener("message", function(msg){ if(conn.connected_username !== msg && msg!="Server"){ if(conn.isRegistered === true) { server.broadcast(JSON.stringify({"who": conn.connected_username, "when": Date.now(), "what": msg})); } else { // name has not been taken yet so assign it! conn.connected_username = msg; conn.send("name ok"); server.broadcast(JSON.stringify({ "who": "Server", "when": Date.now(), "what": msg + " has joined us" })); conn.isRegistered = true; } return; } conn.send("name taken"); }); }); server.addListener("close", function(conn){ server.broadcast(JSON.stringify({ "who": "Server", "when": Date.now(), "what": conn.connected_username + " has left us." })); }); server.listen(16007); 

你为什么要把事情复杂化? 🙂

编辑:再次通过您的代码后,我意识到,您正在使用侦听器来区分用户注册和消息。 对代码进行了更改。

你不能在JavaScript中使用对象作为关键字, [conn]所做的就是在conn上调用toString() 。 几乎没有人在那里覆盖toString()返回一些有用的东西。

那么默认情况下, toString()返回什么? 那么为对象返回[object Object]

conn应该有一个id属性,这将给你一个独特的价值,用作一个关键。