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

Javascript 在页面关闭后向node.js发送消息,javascript,node.js,events,socket.io,onbeforeunload,Javascript,Node.js,Events,Socket.io,Onbeforeunload,所以我对它还很陌生,所以如果我认为这是一种完全错误的方法,我很抱歉,但是我目前正在用node.js和express和socket.io编写一个小的聊天应用程序。我设法在控制台上记录了一条登录消息,但我真的很难注销一条。当用户打开页面时,我从cookie中取出roomname和用户名,并将其发送到服务器,如下所示: var socket = io(); var roomname = readCookie('Roomname'); var nickname = readCookie('Nicknam

所以我对它还很陌生,所以如果我认为这是一种完全错误的方法,我很抱歉,但是我目前正在用node.js和express和socket.io编写一个小的聊天应用程序。我设法在控制台上记录了一条登录消息,但我真的很难注销一条。当用户打开页面时,我从cookie中取出roomname和用户名,并将其发送到服务器,如下所示:

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”,后跟roomname作为频道名,这样只有在正确房间的用户才能看到消息。之后,我整理了客户端收到的消息类型:

case 'user':
  console.log(msg.user + " just " + msg.data + " the room!");
  break;
现在,我唯一需要做的就是在用户关闭页面后,以某种方式将文件室和用户名发送到服务器端,这样我就可以发送带有“left”的消息。(像这样)


我的方法是找到一个在正确的时间触发代码的事件,我已经在堆栈溢出中查找了一个小时了,但是我找不到任何可以完成这项工作的事件。我尝试了
窗口的所有变体。在卸载之前,我可以找到,但它们似乎都不起作用。我可以用它们中的一些将一些东西记录到控制台上,但我永远无法向服务器端发送消息。我知道这可能不可能以我希望的方式实现,但我真的没有办法下一步尝试什么。有人能帮我吗?

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

您无法可靠地知道客户机何时消失。正确的方法是使用一个超时系统。@Pointy这太可悲了!因为我可以在服务器端使用
socket.on('disconnect',myFunction();)
来实现这一点,我的问题是,如果要使用它,我没有任何用户名可显示。如果我没弄错的话,你会提醒我每隔几秒钟发出一条“嘿,我还在这里”的信息,以检测用户何时离开?是吗?是的,类似的,或者只是一个简单的计时器,每次收到用户的实际消息时,你都会重置它。仔细想想,用户关闭浏览器选项卡或关闭计算机与用户只是站着出去吃饭没有多大区别。这真的让我很烦,因为这会不必要地增加客户端和服务器之间的通信量,或者根本不准确但如果这是唯一的选择,我想我必须这样做。如果您确定没有其他方法,请添加此作为答案,以便我可以接受。谢谢你花时间来帮助我这正是我要找的!我刚开始尝试自己构建一个用户变量,但我知道必须有其他方法!我会尝试一下,并尽快告诉你结果!提前多谢!这当然很有用,但是如果用户只是关掉他们的手机或电脑,你就不会收到“断开”事件。我当然会。“断开连接”事件是在服务器端触发的,而不是从客户端接收到的。@mk12ok ah-OK,抱歉;这是有道理的。老兄,你同时修复了我的问题,并全面改进了我的代码!正如我所希望的那样。我太笨了。。我总是想知道为什么没有频道,为什么我必须修补。我过去只在“chat/”之后添加roomname,因此它总是只从例如“chat/room_1”获取消息。你一石二鸟。非常感谢!!:D
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);
});