【问题标题】:Using Socket IO to emit messages when a Node JS process is completed使用 Socket IO 在 Node JS 进程完成时发出消息
【发布时间】:2016-05-07 10:50:54
【问题描述】:

如何使用 Socket IO 和 Express + Nodejs,以便在用户登录时,我在 MEAN 堆栈应用程序的后台运行 MongoDb 更新查询。我必须通知用户 MongoDb 进程已经以非阻塞方式完成。我不想使用回调,因为我必须将用户重定向到登录页面,而无需他等待此查询完成。因此,如果此 MongoDb 进程在用户登录后 30 秒后完成,我想闪烁一条消息,说明查询更新已完成。

我已经设置了 Socket IO,但我不知道如何在我的特定情况下使用它。

Express + 节点代码

io.on('connection', function(client) {
    console.log('Client connected...');
    client.on('complete', function(data) {

        client.emit('messages', 'Hello from server');
    });
});

下面是我的 AngularJs 代码。

var socket = io.connect('/socketTest');
 socket.on('connect', function(data) {
     socket.emit('complete', 'Mongo Process Done');
 });

这些是我从网站复制的示例,我真的不明白需要做什么才能在客户端捕获此事件。

【问题讨论】:

    标签: angularjs node.js sockets socket.io eventemitter


    【解决方案1】:

    如果你想抓住client.emit('messages', 'Hello from server');,你可以这样做

    var socket = io.connect('/socketTest');
     socket.on('connect', function(data) {
         socket.emit('complete', 'Mongo Process Done');
     });
    
     socket.on('messages', function(data) {
         console.log(data) //'Hello from server'
     });
    

    你可以创建套接字工厂

    app.factory('socket', function ($rootScope) {
    var socket = io.connect();
    return {
        on: function (eventName, callback) {
            socket.on(eventName, function () {
                var args = arguments;
                $rootScope.$apply(function () {
                    callback.apply(socket, args);
                });
            });
        },
        emit: function (eventName, data, callback) {
            socket.emit(eventName, data, function () {
                var args = arguments;
                $rootScope.$apply(function () {
                    if (callback) {
                        callback.apply(socket, args);
                    }
                });
            })
        }
    };
    

    并像每个控制器一样使用它

    function MyCtrl($scope, socket) {
        socket.on('message', function(data) {
            ...
        });
    };
    

    【讨论】:

    • 如何进行模块化,以便可以从任何其他文件(而不仅仅是 app.js)实例化套接字?
    • 我得到这个错误:TypeError: io.connect is not a function
    【解决方案2】:

    遵循@aseferov 的回答。

    你也可以使用btford的angular-socket-io library

    这使得以角度方式使用 socket io 变得更加容易。

    例如工厂方法就是:

    简单示例: 在大多数情况下,将以下内容添加到您的应用中就足够了:

    factory('socket', function (socketFactory) {
      return socketFactory();
    });
    

    在 SPA 聊天应用程序中帮助我的一项功能是使用 socket.forward 的能力。这有帮助的原因是,在单页应用程序中,每次切换页面时都会建立一个新的客户端连接,但旧的客户端连接永远不会断开,所以如果我想发送一条消息,它会打印在每个客户端连接的消息框中。

    当使用 socket.forward 方法时,这避免了当用户在路由之间来回导航时重复的事件处理程序,因此我在发送消息时不会打印出重复的方法。

    例子:

    socket.forward('someEvent', $scope);
    $scope.$on('socket:someEvent', function (ev, data) {
          $scope.theData = data;
    });
    

    【讨论】:

      猜你喜欢
      • 2020-11-12
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 2015-12-24
      • 2015-06-14
      • 1970-01-01
      • 2019-03-09
      相关资源
      最近更新 更多