2016-05-23 104 views
0

我试图从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

  1. git clone https://github.com/rauchg/chat-example.git
  2. cd chat-example && npm install
  3. nano index.js
  4. 更改内容与我上面的代码
  5. node index.js
  6. 浏览到localhost:3000,您应该在聊天面板上看到一条公告,因为我在app.get()路线上发布了它。但没有公告。
+0

你想完成什么?你能向我们展示客户端代码吗?您是否试图向所有连接的客户端进行广播? – jfriend00

+0

我试图从我的路由发送消息(发出)到所有连接的客户端。 @ jfriend00 – Eray

+0

当你点击'/'路由时,你的浏览器是否正确地获取了'index.html'?此外,'io.emit('chat message',“msg”)'是发送给所有连接客户端的正确方式。如果你在'app.get()'处理程序中放置了一个'console.log(“got/route”)',你看到了吗?您需要告诉我们您已经完成的基本调试步骤以及您观察到的内容。 – jfriend00

回答

1

你在这个太早发射到新的页面:

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', ...)处理程序中执行此操作,因为这是您知道现在已连接新页面的位置。

+0

在你的答案后,我已经改变了'app.get()'方法,以确保当页面发生完全加载。但没有任何改变。在这里我的代码:http://paste.ubuntu。com/16669943/ – Eray

+0

@Eray - 这还为时过早。现在,当'res.sendFile()'完成时你正在发射,但这只意味着Express已经完成将文件写入TCP堆栈。这并不意味着浏览器已经收到它,解析它,运行脚本并且socket.io连接已经完成。事实上,几乎可以保证其中的一些还没有完成。请在我的回答中重读最后一段。这是你唯一可以“知道”一个新的socket.io连接的地方,现在你已经准备好“.emit()”了。 – jfriend00

+0

@Eray - 这是否回答你的问题? – jfriend00