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/

相关文章:

node.js - new Date() 何时会在我的函数中运行?

javascript - 使用 express js 在浏览器中显示 Pdf

security - socket.io 是否只向订阅者广播?

javascript - Node.js/Socket.io 中对旧版浏览器的 Web Socket 支持

sockets - 是否可以将 UDP 与 socket.io 一起使用?

node.js - 如何使用child_process在相同和不同的终端上运行命令?

mysql - 如何将一些表信息插入到另一个表列中?

node.js - 使用 Node/JS REST API 提供文档

angular - 在 angular-cli@webpack 中使用 socket.io-client

node.js - nginx、node.js + 带 SSL 的 socket.io