2017-02-08 3 views
1

node.jsアプリケーションでrethinkDbのチェンジフィードを複数のユーザーに使用する方法に関するアドバイスが必要です。node.jsアプリでRethinkDBを使用して複数のユーザー変更フィードを管理する方法

ユーザーが私たちのWebアプリケーションにログインしたときに、その特定のユーザーの変更フィードを設定して、ユーザー組織によってフィルタリングされた特定のテーブルの変更を監視する必要があります。

ユーザーが接続すると、socketio経由で接続し、接続時にユーザーの変更フィードを割り当てることができると考えていました。その後、切断時にユーザーカーソルを閉じます。

たぶんのようなもの:

io.on('connection', (socket)=> { 
    //Assume user information is in socket.user 
    r.db('database').table('entries').filter({organization: socket.user.organization}).changes().run(conn, (err, cursor){ 
     cursor_holder[socket.user.id] = cursor //Maybe hold the cursors in memory while the user is connected? 
     cursor.each((err, entry)=>{ 
      socket.emit('update', entry); 
     }) 
    }) 

    socket.on('disconnect',()=>{ 
     cursor_holder[socket.user.id].close() //I dont know what the exact close method is for the feed. 
    }) 
} 

は、コード内のエラーを許しなさいが、これは私が私の最終目標を処理しなければならなかった最初のアイデアでした。

私が以前に述べた最終目標を適切に処理する方法があれば、私は興味があります。

お時間を頂き、ありがとうございます。その大変感謝しています。

+0

? –

答えて

0

また、これについていくつかのヒントを探しています。別の方法があります。変更フィードのデータをテーブルに登録してから、コードを特定のユーザーに新しいデータで更新させる方法です。

ユーザーごとに新しい変更フィードを作成する場合は、多くの同時変更フィードで終了するのではないかと心配しています。同時に何人が走れるかわからない。 ユーザーが単にブラウザを閉じるだけでログアウトするとどうなりますか?チェンジフィードは引き続き実行されると私は信じている。データベースは非公開の変更フィードでいっぱいになるので、ユーザーがもはや変更を受け取ることに興味がないというフィードバックは決して得られません。

0

あなたはどんな変化を検出するためのrethinkdbに照会のためにこれを使用して、それが唯一のrethinkdbコンテキストのために、すべてのユーザーが同じchangefeedに加入している場合、これはいくつかの助け

yield r.table('Us').filter(function (S) { 
        return S //your rethinkdb query 
       }) 
       .changes().merge(function() { 
        return { 
         total: r.table('Us').filter(function (x) { 
          return x //your rethinkdb query 
         }).count(), 
        }; 
       }) 
0

を貸すことを願っていますことを心に留めておくことができますincludeInitialがtrueに設定されている必要はありません。サーバに1つのチェンジ・フィード(サーバーとの接続ごとに1つずつ)を作成し、changefeedをsocket.ioルームにプッシュしてから、部屋は接続します。これはあなたの再考クラスタ上

サーバー側のCPUリソースを節約できるという利点があります:あなたはそのコードをテストした時に何が起こった

var io = require('socket.io')(httpApp, {options}); 

r.table('cats') 
.filter({location : 'kitchen'}) 
.changes({includeTypes : true}) 
.run(rethinkConnection, function(err, cursor) { 
    if (err) { 
     // error handling 
    } else { 
     cursor.each(function(err, row) { 
      if (err) { 
       // error handling 
      } else { 
       io.to('kitcatFeed').emit('kitcatChange', row); 
      } 
     }); 
    } 
}); 

io.on('connection', function(socket) { 
    socket.join('kitcatFeed'); 
}); 
関連する問題