【问题标题】:Node JS and Socket.IO. Client getting disconnected. During request节点 JS 和 Socket.IO。客户端断开连接。请求期间
【发布时间】:2014-11-11 20:43:51
【问题描述】:

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

背景 我正在使用 socket.io 创建一个节点服务器,以提供一个安静的服务,连接到使用 web sockets(socket.io) 来获取服务器-客户端消息的 mongodb。

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

所以我会开始工作,使用节点调度器,当它结束时你可以提供一个函数。

在这个函数中,我发出一个 Web 套接字消息,这正是我在应用程序的其余部分发出消息的方式,但我的客户端从未收到该消息。

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

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

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

【问题讨论】:

    标签: node.js mongodb sockets socket.io


    【解决方案1】:

    一般来说,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.
            });
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 2016-11-19
      相关资源
      最近更新 更多