在页面closures后向node.js发送消息

所以我很新,所以我很抱歉,如果这是一个完全错误的做法,但我目前正在使用express和socket.io使用node.js编程一个小聊天应用程序。 我设法得到一个login消息logging到控制台,但我真的很苦恼注销之一。 当用户打开页面时,我将房间名称和用户名从一个cookie中取出,并发送到服务器,如下所示:

var socket = io(); var roomname = readCookie('Roomname'); var nickname = readCookie('Nickname'); var data = {'type': 'user', 'channel': roomname, 'user': nickname, 'data': "joined"}; socket.emit('chat', data); 

之后,我在服务器端过滤消息,并将答案发送给所有这样的客户端:

 case 'user': io.emit('chat/' + msg.channel, {type: 'user', user: msg.user, data: msg.data}); break; 

我总是发送string“聊天”,然后房间名称作为频道名称,这样只有右侧房间的用户才能看到该消息。 在那之后,我清理了客户端收到了什么样的消息:

 case 'user': console.log(msg.user + " just " + msg.data + " the room!"); break; 

现在我唯一需要做的就是在用户closures页面的时候,把服务器端的用户名和密码发送给服务器端,这样我就可以用“左”的方式发送消息了。 (喜欢这个)

 var data = {'type': 'user', 'channel': roomname, 'user': nickname, 'data': "left"}; socket.emit('chat', data); 

我的方法是find一个在正确的时间触发代码的事件,现在我一直在查看堆栈溢出一个小时,我找不到任何工作。 我已经尝试了window.onbeforeunload所有变种,我可以find,并没有一个似乎工作。 我可以将一些东西login到控制台,但是我从来没有能够向服务器端发送消息。 我意识到,这可能是不可能的,但我真的想到接下来要尝试什么。 有人可以帮我吗?

当客户端首次连接时,可以将有关客户端用户名的信息添加到套接字对象中。 然后,当客户端断开连接时,您将能够使用socket.username。

客户:

 var socket = io(); var roomname = readCookie('Roomname'); var nickname = readCookie('Nickname'); socket.on('connect', () => { socket.emit("hello", {nick:nickname, room:roomname}); }); 

服务器:

 socket.on("hello", (data) => { socket.username = data.nick; socket.join(data.room); socket.room = data.room; }); socket.on("disconnect", () => { var data = {'type':'user', 'channel':socket.room, 'user':socket.username, 'data':'left'}; socket.broadcast.to(socket.room).emit('chat', data}; socket.leave(socket.room); });