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

时间:2016-05-24 00:08:26

标签: 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);
});

当我在本地测试节点时,它工作正常,我发送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(...)似乎返回了没有任何渠道和连接的io服务器!

IIS可能会搞乱吗?我倾向于认为IIS对app.post('/notify'...io.on('connection'...有不同的流程,因此,我在app.post上引用的套接字与我在io.on('connection'.. socket.join(...)加入用户的区别不同}})。

在Azure / IIS中使用socket.io房间时有任何提示吗? 谢谢!

2 个答案:

答案 0 :(得分:0)

要测试Azure App Services上的socket.ioPOST问题,我在Azure上简化了项目并进行了测试。

测试server.js

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var bodyParser = require('body-parser')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 
server.listen(process.env.PORT ||3000, function(){
  console.log('listening on *:3000');
});

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/client.html');
});

app.post('/notify', function(req, res, next) {
  io.sockets.emit('new_notification', req.body);
  res.send(200);
});

io.on('connection', function (socket) {
  socket.emit('get_notifications', "get_notifications_:"+new Date());
});

客户内容:

<body>
    <script src="/socket.io/socket.io.js"></script>
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
    <script>
    var socket = io();
    $.post("/notify",{
      msg:"notification from client"
    });
    socket.on('get_notifications',function(msg){
      console.log(msg);
    });
    socket.on('new_notification',function(msg){
      console.log(msg);
    });
    </script>
  </body>

这个简单的项目在Azure App Services上运行良好。

因此,可能是您的应用程序的其他部分引发了您的问题。

您可以检查Diagnostics Logs或利用Visual Studio Team Services来解决问题。有关如何在Azure App Services上启用Team Services扩展,请参阅How to run django manage.py command on Azure App Service的答案。

如有任何疑问,请随时告诉我。

答案 1 :(得分:0)

您是否尝试添加&#39;断开&#39;调试处理程序?

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'..)的一些缺失结束括号。我希望这只是你在这里粘贴的代码。