2017-06-25 241 views
0

我想從服務器發送消息到客戶端,在我的平均堆棧項目的routes/index.js中執行此操作。有誰知道如何socket.io這裏?:使用從服務器(Expressjs路由)發送消息到客戶端

router.post('/message/sendMessage', function (req, res, next) { 
    console.log("router.post /message/sendMessage " + req.body) 
    // send req.body to client 
}); 

PS:以前,我已經使用socket.io項目中的一個時間:客戶端打開一個套接字,然後服務器發出一個名爲id消息時,客戶端收到它。在客戶端:

socket = io.connect(); 
socket.on('id', function (id) { ... }) 

www(服務器):

io.sockets.on('connection', function (socket) { 
    console.log("LOG: just connected: " + socket.id); 
    socket.emit('id', socket.id); 
    socket.on('disconnect', function() { 
    console.log("LOG: just disconnected: " + socket.id) 
    }) 
}) 

但我無法想象如何寫socket.emit Expressjs路由裏面......

編輯1:我試着執行以下操作向所有客戶端發送消息,但在控制檯中,它只顯示到before emit,並且在客戶端顯示Failed to load resource: the server responded with a status of 500 (Internal Server Error)

router.post('/message/sendMessage', function (req, res, next) { 
    console.log("router.post /message/sendMessage"); 
    console.log("before emit"); 
    io.sockets.on('connection', function (socket) { 
     console.log("LOG: just connected: " + socket.id); 
     io.emit("message", "this is a test"); 
     socket.on('disconnect', function() { 
      console.log("LOG: just disconnected: " + socket.id) 
     }) 
    }) 
    console.log("after emit"); 
}); 
+0

你有一個用於你的http連接的會話對象嗎?如果是這樣,你可以在socket.io連接第一次連接時將'socket.id'放到會話中,然後你可以從任何http請求的session對象中獲取socket.id並使用socket.id可以得到你可以通過socket.emit()打開的套接字。 – jfriend00

+0

假設我可以將ID傳遞給http請求,我怎樣才能從ID獲取套接字? – SoftTimur

+0

正如我以前問過的那樣,您是否已經爲http連接建立了快速會話?如果是這樣,有一些模塊可以幫助你在http和socket.io套接字之間進行互連。請回答關於您是否已建立會議的問題? – jfriend00

回答

0

其實我的問題歸結爲一個常見問題:如何在express路徑文件中使用socket.io。

,我發現一個超級答案:https://stackoverflow.com/a/31277123/702977

所以在www

var io = require('socket.io').listen(server); 
app.set('socketio', io); 

index.js

router.post('/message/sendMessage', function (req, res, next) { 
    console.log("router.post /message/sendMessage"); 
    var io = req.app.get('socketio'); 
    io.emit("message", "hi!"); 
    res.json("hahaha") 
}); 

如果我想將消息發送到某個客戶,我需要將id這樣的信息作爲參數傳遞給router.post,然後使用例如io.to(req.body.id).emit("message", req.body.message);

+1

'io.emit()'發送給所有連接的客戶端,而不僅僅是發出http請求的客戶端。 – jfriend00

相關問題