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

时间:2017-09-20 12:25:42

标签: javascript node.js events socket.io onbeforeunload

所以我对它很陌生,所以我很抱歉,如果我这是一个完全错误的做法,但我目前正在使用带有express和socket.io的node.js编写一个小聊天应用程序。我设法将登录消息记录到控制台,但我真的很难退出登录。当用户打开页面时,我会从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;

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

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

socket.emit('chat', data);

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

1 个答案:

答案 0 :(得分:2)

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