2016-05-07 3 views
1

ユーザーログイン時にMEANスタックアプリケーションのバックグラウンドでMongoDb更新クエリを実行するように、ソケットIOとExpress + Nodejを使用する方法。私はMongoDbプロセスが非ブロック的な方法で完了したことをユーザーに通知する必要があります。このクエリが完了するのを待たずにユーザーをリンク先ページにリダイレクトする必要があるため、コールバックを使用したくありません。そのため、ユーザーがログインしてから30秒後にこのMongoDbプロセスが完了すると、クエリの更新が完了したことを示すメッセージが点滅します。ノードJSプロセスが完了したときにソケットIOを使用してメッセージを送信する

私はソケットIOをセットアップしましたが、自分の状況に合わせて使用​​する方法がわかりません。

エクスプレス+ノードコードの下

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'); 
}); 

これらは私がウェブサイトからコピーされたと私はクライアント側でこのイベントをキャッチすることができるように、私は本当に何をすべきか理解していない例です。

答えて

2

あなたが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) { 
     ... 
    }); 
}; 
+0

どのように私はソケットが、他のファイルだけではなく、app.jsからインスタンス化することができるようにモジュール化しますか? –

+0

更新された回答。 – aseferov

+0

このエラーが発生しました:TypeError:io.connectは関数ではありません –

1

などのすべてのコントローラがのオフ後にそれを使用することができますすることができます@ aseferovの答え。

また、あなたはbtfordのangular-socket-io library

を使用することができますこれは非常に簡単に角度方法ioのソケットを使用できるようになります。例えば

ファクトリメソッドだけです:SPAチャットアプリで私を助け

Simple Example: In most cases, adding the following to your app should suffice:

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

また1機能がsocket.forwardを使用する機能でした。これは、ページを切り替えるたびに1つのページアプリケーションで新しいクライアント接続が行われるが、古いものは切断されないので、メッセージを送信する場合は、すべてのクライアント接続のメッセージボックスに表示されるためです。

socket.forwardメソッドを使用すると、ユーザーがルート間を行き来するときにイベントハンドラが重複することを避けるので、メッセージの送信時に重複したメソッドが表示されません。

例:

socket.forward('someEvent', $scope); 
$scope.$on('socket:someEvent', function (ev, data) { 
     $scope.theData = data; 
}); 
関連する問題