每次更新数据库时,如何通过socket io发出数据?

时间:2015-04-15 23:43:15

标签: node.js socket.io

我正在建立一个系统,我有一个带有客户端界面的独立管理仪表板。前端建立在angularjs上,我使用后端的样板Node.js / Express服务器,我已连接到MySql数据库。

每次客户端从客户端界面提交新信息时,都会将其提交给服务器,由路由器路由到控制器,控制器将数据传递给模型并将其上传到数据库。

我想做的是每次调用处理请求的控制器时,请求完成后,我想通过socket.io将新数据发送到管理仪表板。

我的挑战是我不知道如何从控制器内访问套接字???任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

是的,这很棘手。像Express一样,Socket.io是一个自己的请求处理库。它们都是独立工作的,因此没有简单的方法来切换"从Express到Socket。

但是,如果您可以唯一地标识客户端,则可以将其socket.id存储在某处,然后您可以使用Express控制器中的io向该客户端的套接字发送。

您可以执行与io.to(socket.id).emit相同的socket.emit,只要您拥有socket.id,就可以使用全局可用的io向其发出。

我在大多数应用中使用Passport身份验证,因此我发现使用req.user是唯一标识客户端的好方法。它甚至可以是幕后的"伪"通过为每个客户端生成随机用户ID /传递进行身份验证

然后有passport.socketio模块从socket.io连接访问passport.js用户信息。 Here's an article from the author that goes into the details of it all

将它们组合使用,您可以使用user对象来存储和访问socket.id,并使用它通过socket.io与客户端进行通信

io.on('connection', function(socket){
    var user = socket.request.user; // from socketio.passport

    // store the socket.id inside the user so it can be retrieved from Express
    user.socketid = socket.id;
});
app.post('/form', function(req, res, next){
    var user = req.user;           // from Passport
    var socketid = user.socket.id  // from socket above

    var data = req.body;
    doStuff(data);

    io.to(socketid).emit('done');
});
相关问题