【问题标题】:How do I emit data over socket io every time the database is updated?每次更新数据库时,如何通过套接字 io 发出数据?
【发布时间】:2015-04-15 23:43:14
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

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

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

    您可以使用与socket.emit 相同的io.to(socket.id).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');
    });
    

    【讨论】:

    • 感谢您的回复!这看起来很激烈,所以我今天要深入研究一下,看看我能做些什么。几个问题给你。对于这两个部分 - 它们是否发生在主 app.js 文件中?还是路由器中的“app.post”? “user.socketid”如何传递给 app.post?
    • req.usersocket.request.user,所以在某种程度上,(user) 是 Express 和 Socket 之间的“桥梁”。配置 Passport 和 socketio.passport 后,一切都会变得更有意义。
    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多