页面关闭后向 node.js 发送消息

emitting a message to node.js after page close

所以我对它很陌生,所以如果我这样做是完全错误的方法,我深表歉意,但我目前正在使用 node.js 和 express 和 [=29 编写一个小聊天应用程序=].我设法将登录消息记录到控制台,但我真的很难处理注销消息。当用户打开页面时,我从 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;

我总是发送字符串 "chat" 后跟房间名称作为频道名称,这样只有在正确房间的用户才能看到消息。之后我整理一下客户端收到了什么样的消息:

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

现在我唯一需要做的就是在用户关闭页面后以某种方式将房间和用户名发送到服务器端,这样我就可以发送消息,但使用 "left"。 (像这样)

var data = {'type': 'user', 'channel': roomname, 'user': nickname, 'data': "left"};

socket.emit('chat', data);

我的方法是找到一个在正确时间触发代码的事件,我已经查看堆栈溢出一个小时了,但我找不到任何可以完成这项工作的东西。我已经尝试了我能找到的 window.onbeforeunload 的所有变体,其中 none 似乎有效。我可以用其中一些将一些东西记录到控制台,但我永远无法向服务器端发送消息。我知道这可能无法以我希望的方式实现,但我真的 运行 不知道接下来要尝试什么。有人可以帮我吗?

当客户端第一次连接时,您可以将有关客户端用户名的信息添加到套接字对象中。然后你就可以在客户端断开连接时使用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);
});