2017-06-25 205 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

相关问题