Socket.IO在Express 4路由上发出
我试图从express 4路由向我所有连接的客户端发送socket.io消息。我在同一个文件中的所有路线,它从官方socket.io chat example克隆。我想向我所有最近连接的客户端发出“公告”消息。Socket.IO在Express 4路由上发出
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
对象作为参数传递给路由,但它仍不起作用。如果我从客户端JavaScript发出消息,它正在工作。
"dependencies": {
"express": "4.10.2",
"socket.io": "1.2.0"
}
步骤来重现问题,例如聊天的index.js
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('/', function(req, res){
res.sendFile(__dirname + '/index.html');
io.sockets.emit('chat message', "ANNOUNCEMENT : ..."); // <-- HERE
});
新页面尚未完成使得它socket.io连接,所以它不会得到.emit()
。实际上,因为res.sendFile()
是异步的,所以新页面甚至可能还没有开始进行socket.io连接。
你尽快做.emit()
为res.sendFile()
被启动,但如果你把console.log()
语句到服务器的代码,你会看到发生前的连接到达。所以,你在客户端实际完成socket.io连接之前发射了。
如果您打算在页面初始化时发送某些内容,则应该在服务器端io.on('connection', ...)
处理程序中执行此操作,因为这是您知道现在已连接新页面的位置。
在你的答案后,我已经改变了'app.get()'方法,以确保当页面发生完全加载。但没有任何改变。在这里我的代码:http://paste.ubuntu。com/16669943/ – Eray
@Eray - 这还为时过早。现在,当'res.sendFile()'完成时你正在发射,但这只意味着Express已经完成将文件写入TCP堆栈。这并不意味着浏览器已经收到它,解析它,运行脚本并且socket.io连接已经完成。事实上,几乎可以保证其中的一些还没有完成。请在我的回答中重读最后一段。这是你唯一可以“知道”一个新的socket.io连接的地方,现在你已经准备好“.emit()”了。 – jfriend00
@Eray - 这是否回答你的问题? – jfriend00
你想完成什么?你能向我们展示客户端代码吗?您是否试图向所有连接的客户端进行广播? – jfriend00
我试图从我的路由发送消息(发出)到所有连接的客户端。 @ jfriend00 – Eray
当你点击'/'路由时,你的浏览器是否正确地获取了'index.html'?此外,'io.emit('chat message',“msg”)'是发送给所有连接客户端的正确方式。如果你在'app.get()'处理程序中放置了一个'console.log(“got/route”)',你看到了吗?您需要告诉我们您已经完成的基本调试步骤以及您观察到的内容。 – jfriend00