node.js - 每次更新数据库时如何通过套接字 io 发出数据?

标签 node.js socket.io

我正在构建一个系统,其中有一个带有客户端界面的独立管理仪表板。前端基于 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/

相关文章:

javascript - 使用 Async.parallel 我的参数的生命周期不会超过使用 MongoDB 的 NodeJS 中的异步调用

javascript - 哪个 nodejs 记录器具有运行时日志级别更改、纯文本/JSON 支持和简单的 API

javascript - 为什么我的 io.on 是 ('connect' , function (socket) {//functions... });服务器端函数触发的次数与我打开的选项卡的次数相同?

node.js - 无法使用 tls 连接 node.js 中的 socket.io

node.js - Mailgun 邮件进入 Outlook 垃圾邮件调试

node.js - git 无法提交 - 错误 husky > npm run -s commitmsg

javascript - 通过Unity3D调用node.js中的javascript函数?

node.js - 自定义 node-red-node socket.io 客户端建立连接但在接收数据时崩溃?

javascript - 使用 Express 4 模块化 Socket.io

node.js - 套接字方法的瓶颈?