8

私は実際に Meteor を少しいじっていますが、このトピックについての理解がまだいくらか (またはかなり!) 不足していることに気付きました。

たとえば、node.js/express/socket.io を使用して簡単なリアルタイム チャットを作成するチュートリアルを次に示します: http://net.tutsplus.com/tutorials/javascript-ajax/real-time-chat-with -nodejs-socket-io-and-expressjs/

上記の例では、socket.io を介して Web サーバーがデータを受信し、それを接続されているすべてのクライアントに渡します。すべてデータベースにアクセスする必要はありません。

Meteor では、私が見たすべての例で、クライアントは mongodb に書き込むことによって更新され、それによってすべてのクライアントが更新されます。しかし、データベースにデータを書き込む必要がない場合はどうすればよいでしょうか? すべてのクライアントにデータを渡すのはコストがかかるようです。

ここで何かが欠けていると確信しています。最初にデータベースに書き込む費用を必要とせずに、すべてのクライアントを更新する Meteor の方法 (たとえば、単純なチャット アプリのように) は何でしょうか?

ありがとうございました!

4

4 に答える 4

6

サーバー上のパブリッシュ機能は、データをクライアントに送信します。データベースからクエリ結果を発行するための便利なショートカットがいくつかありますが、これらを使用する必要はありません。publish 関数には this.added()、this.removed()、および this.changed() があり、選択したものをすべて公開できます。その後、クライアントはサブスクライブし、公開されたデータを受け取ります。

例えば:

if ( Meteor.isClient ){
  var someMessages = new Meteor.Collection( "messages" );  //messages is name of collection on client side
  Meteor.subscribe ( "messagesSub" );  //messagesSub tells the server which publish function to request data from

  Deps.autorun( function(){
    var message = someMessages.findOne({});
    if ( message )  console.log( message.m ); // prints This is not from a database
  });
}

if (Meteor.isServer ) {
  Meteor.publish( "messagesSub", function(){
    var self = this;
    self.added ( "messages", "madeUpId1", { m: "This is not from a database"} ); //messages is the collection that will be published to
    self.ready();
  });
}

ここで説明されている流星のドキュメントに例があり、ここに別の例があります。パブリッシュとサブスクライブがどのように機能するかを独学するためだけに、データベースを使用せずにクライアント間でデータを共有する例もあります。基本的な流星以外は何も使用されていません。

于 2013-07-24T11:17:35.217 に答える
3

サーバー上にデータベースを必要とせずに、Meteor の livedata パッケージ (DDP 実装) を使用することができます。これはAvital Oliver によってデモされたもので、以下に関連する部分を示します。

ここで魔法が起こります:

if (Meteor.isServer) {
    TransientNotes = new Meteor.Collection("transientNotes", {connection: null});
    Meteor.publish("transientNotes", function () {
        return TransientNotes.find();
    });
}

if (Meteor.isClient) {
    TransientNotes = new Meteor.Collection("transientNotes");
    Meteor.subscribe("transientNotes");
}

設定connection: nullでは、接続が指定されていません (Meteor のドキュメントを参照)。


Akshat はストリームの使用を提案しました。評判が悪くて彼のコメントに返信できないので、ここに載せておきます。彼がリンクしているパッケージは、もはや積極的に保守されていません (作者のツイートを参照してください)。代わりに yuukan:streamy (Atmosphere で調べてください) パッケージを使用するか、Meteor 自体で使用されている基礎となる SockJS ライブラリを使用することをお勧めします。これを行う方法は、Meteor コードを調べて、Meteor.server.Stream_server の仕組みを調べることで学習できます。 Meteor.connection._stream が使用されます。これは、Streamy パッケージが行うことです。

Streamy チャットの例の実装をテストしたところ、パフォーマンスはほとんど変わらないことがわかりましたが、これは初歩的なテストに過ぎませんでした。最初のアプローチを使用すると、ミニモンゴの実装 (発見など) と Meteor の反応性の利点が得られます。ReactiveVar を使用するなどの方法で実現できますが、Streamy ではリアクティブが可能です

于 2015-03-10T11:27:46.567 に答える