2016-05-23 65 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