2012-11-24 7 views
10

私はMeteorにデータセンシティブなアプリケーションを作成しており、できるだけ多くの情報にクライアントアクセスを制限しようとしています。したがって、私は、ログインして匿名のユーザーの数を数える方法をサーバー側に実装したいと考えています。メテオでサーバー側の匿名ユーザー数を追跡する方法は?

私はさまざまな方法を試みました。私がやった、とコレクションを変更しようとしたときしかし、それはエラー「流星のコードは常に、ファイバ内で実行しなければならない」投げた

this.session.socket.on("close") 

:最初はにフック示唆この質問Server cleanup after a client disconnects、に概説されているようでした。私はこの問題があると仮定します。ソケットが閉じられると、そのファイバーは強制終了され、データベースにアクセスすることは不可能になるからです。 OPはこの可能性のある解決策として"Meteor code must always run within a Fiber" when calling Collection.insert on serverを指摘しましたが、それが答えのコメントに基づいて最良の方法であるかどうかはわかりませんでした。

私は、変数に自動実行しようとした:

Meteor.default_server.stream_server.all_sockets().length 

が、自動実行が呼び出されるように見えたことがないので、私は変数は反応性のコンテキストではないと仮定している、と私は確信してどのようにではなかったですそれを一つにする。

最後のアイデアはキープアライブスタイルのことでしたが、それは完全にメテオの哲学の穀物に逆らっているようです。私は絶対的な最後の手段としてのみ使うと思います。

this.session.socketの機能のconsole.logを実行しましたが、可能な他の機能は.on("data")でしたが、ソケットが閉じているときは呼び出されません。

ここでは少し迷っていますので、どんな助けもあります。 ありがとうございました。

答えて

8

上記の2つの回答を組み合わせるのが最もよい方法です。言い換えれば、次の操作を行います

これはおそらくMeteorでこれを実装する正式な方法です。私はこれをMeteoriteでインストールできるスマートパッケージとして作成しました:https://github.com/mizzao/meteor-user-status

+0

十分にありがとうございます:) – Pawan

+0

これは非常にクールですが、ドキュメントでは特にanonユーザーを追跡しないので、元の質問には本当に答えません。 – cazgp

+1

@cazgp私はこの記事を書いて以来、匿名ユーザーを追跡するためにパッケージを更新しました。当然、Meteor.usersで匿名ユーザーを追跡することはできませんが、その接続はすべて追跡されます。 –

2

アウト今オンラインであるどのように多くのユーザーが表示するためのGitHubプロジェクトhowmanypeoplearelooking

流星アプリケーションのテスト。

+0

いたずらです。私はコードをダウンロードしました( 'Dumbs = new Meteor.Collection(" dumbs ");' :)) – Matanya

+0

@Matanya: 'Dumbs'はちょっとしたコレクション名ですが、[appは動作します](https:// github .com/murilopolese/howmanypeoplearelooking/pull/2)。 –

3

ソーラスのおかげで、私はこれを解決することができました。彼の答えには心臓が含まれていました。しかし、それはMeteorの "bindEnvironment"を使うというトリックを含んでいました。これにより、アクセスできないコレクションへのアクセスが可能になります。

Meteor.publish("whatever", function() { 
    userId = this.userId; 
    if(userId) Stats.update({}, {$addToSet: {users: userId}}); 
    else Stats.update({}, {$inc: {users_anon: 1}}); 

    // This is required, because otherwise each time the publish function is called, 
    // the events re-bind and the counts will start becoming ridiculous as the functions 
    // are called multiple times! 
    if(this.session.socket._events.data.length === 1) { 

    this.session.socket.on("data", Meteor.bindEnvironment(function(data) { 
     var method = JSON.parse(data).method; 

     // If a user is logging in, dec anon. Don't need to add user to set, 
     // because when a user logs in, they are re-subscribed to the collection, 
     // so the publish function will be called again. 
     // Similarly, if they logout, they re-subscribe, and so the anon count 
     // will be handled when the publish function is called again - need only 
     // to take out the user ID from the users array. 
     if(method === 'login') 
     Stats.update({}, {$inc: {users_anon: -1}}); 

     // If a user is logging out, remove from set 
     else if(method === 'logout') 
     Stats.update({}, {$pull: {users: userId}}); 

    }, function(e) { 
     console.log(e); 
    })); 

    this.session.socket.on("close", Meteor.bindEnvironment(function() { 
     if(userId === null || userId === undefined) 
     Stats.update({}, {$inc: {users_anon: -1}}); 
     else 
     Stats.update({}, {$pull: {users: userId}}); 
    }, function(e) { 
     console.log("close error", e); 
    })); 
    } 
} 
関連する問題