我正在构建一个系统,其中有一个带有客户端界面的独立管理仪表板。前端基于 angularjs 构建,我在后端使用样板 Node.js/Express 服务器,并将其连接到 MySql 数据库。
每次客户端从客户端界面提交新信息时,它都会提交到服务器,由路由器路由到 Controller , Controller 将数据传递到模型并将其上传到数据库。
我想做的是每次调用处理请求的 Controller 时,在请求完成后,我想通过 socket.io 将新数据发送到管理仪表板。
我的挑战是我不知道如何从 Controller 内访问套接字???任何帮助将不胜感激!
最佳答案
是的,这很棘手。与 Express 一样,Socket.io 也是一个自己的请求处理库。它们都是分开且独立工作的,因此没有简单的方法从 Express“切换”到 Socket。
但是,如果您可以唯一地标识客户端,则可以将其 socket.id
存储在某处,然后您可以使用 Express Controller 中的 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');
});
关于node.js - 每次更新数据库时如何通过套接字 io 发出数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29662903/