[英]Socket.IO emit on Express 4 route
我正在尝试通过express.4路由将消息发送给我的所有具有socket.io的已连接客户端。 我所有的路由都在同一个文件中,它是从官方的socket.io chat example中克隆的。 我想向所有最近连接的客户端发出“公告”消息。
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
io.sockets.emit('chat message', "ANNOUNCEMENT : ..."); // <-- HERE
});
io.on('connection', function(socket){
socket.on('chat message', function(msg){
console.log(msg);
io.emit('chat message', msg);
});
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
但是它没有发出消息,控制台上也看不到任何东西。 我已经将路由移动到另一个文件,并将io
对象传递给route作为参数,但是仍然无法正常工作。 如果我从客户端JavaScript发出消息,它就可以正常工作。
"dependencies": {
"express": "4.10.2",
"socket.io": "1.2.0"
}
git clone https://github.com/rauchg/chat-example.git
cd chat-example && npm install
nano index.js
node index.js
localhost:3000
,您应该会在聊天面板上看到一条公告,因为我正在app.get()
路由上app.get()
该公告。 但是没有公告。 您通过以下方式过早地进入了新页面:
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
io.sockets.emit('chat message', "ANNOUNCEMENT : ..."); // <-- HERE
});
新页面尚未完成与socket.io的连接,因此不会获得.emit()
。 实际上,由于res.sendFile()
是异步的,因此新页面甚至可能尚未开始建立其socket.io连接。
一旦启动res.sendFile()
,您就在执行.emit()
,但是如果将console.log()
语句放入服务器代码中,您将看到在连接到达之前发生这种情况。 因此,您需要在客户端实际完成其socket.io连接之前发出通知。
如果打算在页面初始化时发送某些内容,则应在服务器端io.on('connection', ...)
处理程序中进行处理,因为这是您现在知道新页面已连接的地方。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.