我的节点网络服务器遇到了一个相当难以调试的错误。
背景 我正在创建一个带有socket.io的节点服务器来提供一个宁静的服务,连接到使用web套接字(socket.io)作为服务器客户端消息的mongodb。
问题 在我的节点应用程序中,我使用了一个名为node-scheduler的npm包,其中我在设定的时间进行了一些处理(这些是非常动态的时间但是到目前为止工作得很好)。
所以我将使用node-scheduler启动一项工作,当它结束时你可以提供一个函数。
在这个函数中,我发出一个Web套接字消息,确切地说我在应用程序的其余部分发出消息,但我的客户端从未收到消息。
检查日志,客户端断开连接,然后在功能完成后重新连接。
我进一步调试了,我在这个函数中向客户端发送了两条消息。其中只有一个由客户处理。可能是客户端问题而不是服务器问题。
任何有关解决方案或建议的想法都将不胜感激。
答案 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.
});
});
});