Node JS和Socket.IO。客户端断开连接。在请求期间

时间:2014-11-11 20:43:51

标签: node.js mongodb sockets socket.io

我的节点网络服务器遇到了一个相当难以调试的错误。

背景 我正在创建一个带有socket.io的节点服务器来提供一个宁静的服务,连接到使用web套接字(socket.io)作为服务器客户端消息的mongodb。

问题 在我的节点应用程序中,我使用了一个名为node-scheduler的npm包,其中我在设定的时间进行了一些处理(这些是非常动态的时间但是到目前为止工作得很好)。

所以我将使用node-scheduler启动一项工作,当它结束时你可以提供一个函数。

在这个函数中,我发出一个Web套接字消息,确切地说我在应用程序的其余部分发出消息,但我的客户端从未收到消息。

检查日志,客户端断开连接,然后在功能完成后重新连接。

我进一步调试了,我在这个函数中向客户端发送了两条消息。其中只有一个由客户处理。可能是客户端问题而不是服务器问题。

任何有关解决方案或建议的想法都将不胜感激。

1 个答案:

答案 0 :(得分:0)

通常socket.io只能用作“频道”。您应该将客户端作为内存中的单独实体存在,并在其重新连接时更新套接字。否则你只是发送到过去(断开连接)的套接字。

使用passport,您可以将客户端标识为用户。

app.get('/', function(req, res){
    // req.user;
});

使用passport.socketio,您可以在套接字中获得相同的用户

io.on('connection', function(socket){
    // socket.request.user;

    socket.request.user.socket = socket;
    // this will be updated with the latest socket in case of a future reconnection
    // So now you can be sure that user object will always have the latest socket

    nodeScheduler(function(){
        carryOutJobs(function callback(){
            socket.request.user.socket.emit('done');
            // will always emit to the "latest" socket.
        });
    });
});