如何使用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');
});
这些是我从网站上复制的例子,我真的不明白需要做什么才能在客户端抓住这个事件。
答案 0 :(得分:3)
如果你想要捕获public class SpecialSavings_Driver {
public static void main(String[] args){
SpecialSavings saver1 = new SpecialSavings(2000.00);
SpecialSavings saver2 = new SpecialSavings(3000.0);
}
}
,你可以简单地执行此操作
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);
}
});
})
}
};
答案 1 :(得分:1)
关闭@aseferov回答。
你也可以使用btford的angular-socket-io library
这使得以角度方式使用socket更加容易。
例如,工厂方法只是:
简单示例: 在大多数情况下,将以下内容添加到您的应用中就足够了:
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;
});