我用socket.io和node.js制作了一个简单的应用程序,它是一个推送通知服务。 当用户连接到 websocket 时,发送他的用户名(和仪表板名称)并立即加入以该用户命名的房间。应用程序监听 POST 请求,保存它们,然后向用户房间发送一条消息。
io.on('connection', function(socket) {
socket.on('userid', function(data) {
socket.join(data.userid+'-'+data.dashboard);
notification.find({userid: data.userid, to: data.dashboard, received_by_user: false}, function(err, notifs) {
socket.emit('get_notifications', notifs);
}
}
});
app.post('/notify', function(req, res, next) {
var notif_recv = new notification(req.body);
notif_recv.save(function (err, notif_recv) {
io.sockets.in(notif_recv.userid+'-'+notif_recv.dashboard).emit('new_notification', notif_recv);
});
res.send(200);
});
当我在本地使用 Node 测试它时,它工作正常,我发送了 POST
至/notify
我可以看到通知到达仪表板。问题是,当我在 Azure 上测试 AppService 时,客户端连接到 websocket 并收到第一个通知( get_notifications
事件),但是当我 POST
时至/notify
,客户端没有收到任何东西! (没有 new_notification
事件,io.sockets.in(...).emit(...)
似乎不适用于 Azure)。
出于调试目的,我使用 console.log(...) 在服务器上记录函数 socket.join(...)
的返回值和io.sockets.in(...).emit(...)
,结果是 io.socket.in(...).emit(...)
似乎返回一个没有任何 channel 和连接的 io 服务器!
IIS 可能会搞乱它吗?我倾向于认为 IIS 对于 app.post('/notify'...
有不同的进程和io.on('connection'...
因此,我在 app.post 上引用的套接字与我在 io.on('connection'..
中加入用户的套接字不同(socket.join(...)
)。
在 Azure/IIS 中使用 socket.io 房间时有什么提示吗? 谢谢!
最佳答案
您是否尝试添加“断开连接”处理程序以进行调试?
io.on('connection', function (socket) {
socket.on('disconnect', function(){ //add this part
console.log('Client disconnected');
});
socket.emit('get_notifications', "get_notifications_:"+new Date());
});
还记录每次发送和接收,以便您准确地知道客户端何时断开连接。如果在 get_notifications
事件之后断开连接,请确保您没有向客户端发送回调,或者客户端不期望来自服务器的回调。
我注意到 notification.find(..)
和 socket.on('userid'..)
缺少一些右大括号。我希望这仅存在于您粘贴到此处的代码中。
关于node.js - Socket.IO 房间不在 Azure 上工作,但在本地工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37402476/