我使用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房间时有任何提示吗? 谢谢!
答案 0 :(得分:0)
要测试Azure App Services上的socket.io
和POST
问题,我在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'..)
的一些缺失结束括号。我希望这只是你在这里粘贴的代码。