node.js - Socket.IO 房间不在 Azure 上工作,但在本地工作

标签 node.js azure iis websocket socket.io

我用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/

相关文章:

javascript - 使用 Node.js 进行 Ajax 请求

azure - ARM 模板 - 部署链接服务时错误请求失败

azure - 如何解决 'lastindexof' 是一个原语,不支持 Azure 数据工厂中的嵌套属性

azure - 在 Azure 机器学习工作台的 Azure 订阅中找不到实验帐户

wcf - 如何让IIS等待WCF服务准备好?

visual-studio-2008 - ASP.NET 开发服务器(又名 Cassini)是否支持 SSL?

javascript - 在生产中使用 babel-node 可以吗

node.js - faker 可以用来创建假的 JSON 数据吗

iis 6 重定向或 seo 友好 url?

javascript - 使用嵌套数组中的值对 json 对象进行分组求和和转换