每次更新数据库时,如何通过套接字io发送数据?

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

每当客户端从客户端接口提交新的信息时,就将其提交给服务器,由路由器路由到控制器,控制器将数据传递给模型并上传到数据库。

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

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

是的,这很棘手。 像Express一样,Socket.io是一个自己的请求处理库。 它们都是分开独立工作的,所以没有简单的方法将Express切换到Socket。

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

你可以做到与io.to(socket.id).emit相同的io.to(socket.id).emit ,只要你有socket.id你就可以用全局可用的io发送给它。

我在大多数应用程序中使用Passport身份validation,所以我发现使用req.user是唯一标识客户端的好方法。 它甚至可以通过为每个客户端生成随机的userid / pass来进行幕后的“伪”authentication。

然后有这个passport.socketio模块从socket.io连接访问passport.js用户信息。 这是一篇来自作者的文章,详细介绍了这一切 。

一起使用它们可以使用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'); });