使用Socket IO在Node JS进程完成时发出消息

如何使用Socket IO和Express + Nodejs,以便在用户login时,我在MEAN栈应用程序的后台运行MongoDb更新查询。 我必须通知用户MongoDb进程已经以非阻塞的方式完成。 我不想使用callback,因为我必须将用户redirect到login页面,而无需等待此查询完成。 所以,如果这个MongoDb进程在用户login后的30秒之后完成,我想要刷新一条消息,说明已经完成了查询更新。

我已经设置套接字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'); }); 

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

如果你想捕获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' }); 

你可以创build套接字工厂

 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) { ... }); }; 

closures@aseferov的答案。

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

这使得以angular度方式使用套接字变得更容易。

例如工厂方法只是:

简单的例子:在大多数情况下,添加以下内容到您的应用程序应该足够了:

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

还有一个function,帮助我在SPA聊天应用程序是使用socket.forward的能力。 之所以这么做,是因为在一个页面应用程序中,每次切换页面时都会创build一个新的客户端连接,但是旧的连接不会断开连接,所以如果我想发送一条消息,就会在每个客户端连接的消息框中打印出来。

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

例:

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