3

要求に応じて Meteor フレームワークで構造化データをクライアントに送信するための最もパフォーマンスの高いソリューションを探しています。

問題: データベースからクライアントにデータを送信する前に、クライアントに送信されるサーバー側で生成された追加情報 (つまり、多くのオブジェクトのセキュリティ資格情報) を追加したい場合があります。このデータはタイム クリティカルになる可能性があるため (つまり、有効期限のタイムスタンプが原因で)、データベースに格納しないでください。また、このデータはクライアント側で処理できない場合があります (つまり、セキュリティ上の理由により)。多くの場合、このデータは実際のデータベース データに構造的に関連していますが、新しいリクエストで破棄して再生成したい場合があるため、単一のリクエストにも非常に関連しています。

あなたはできる(少なくとも設計上..):

  1. 2 番目のコレクションを作成し、そこにリクエスト関連のデータを保存して公開し、書き込みオーバーヘッドを受け入れます。つまりMeteor.myTemplate.destroyed=function(){...}、データを削除して、別の書き込みオーバーヘッドを再び受け入れます。

  2. 各エントリをセッション変数に保存しますが、後でそれを削除する必要もあります ( Meteor.myTemplate.destroyed=function(){...})。

  3. このデータを dom に保存します (つまり、非表示要素または可視要素の属性またはデータ フィールド)。
  4. Meteor.call('method',arguments,callback(){...})適切なデータを dom に保存し、argumentsjQuery でそれらを注入することにより、dom からこのデータを生成しますcallback(){...}

あなたはできません:(設計による!!)

  1. Meteor.publish("name",function(){...})サーバー内で変換を使用する
  2. Meteor.call()a の変換内で a を使用します (結果を推測するためにクライアントにTemplate.variable=function(){return collection.find(...)}対応する がある場合も同様です!)。Meteor.method()

繰り返しますが、私が探しているのは、これに対する最高のパフォーマンスのソリューションです。

4

4 に答える 4

2

私が気にかけている変換の問題に対処するために、一連の匿名関数ではなくスマート モデルが何かを行うという観点から考えているため、サーバー変換の例を次に示します。パブリッシュしますが、サーバーの変換に関する議論の下にある点を示しています)。

あなたはこれを得るでしょう:

各画像ローカル

データ:LOLCATZ RULZ
  変身:
データ:LOLCATZ RULZ
  変身:

各画像サーバーが変換される

データ:LOLCATZ RULZ
  変換: XYZ
データ:LOLCATZ RULZ
  変換: XYZ

から:

<template name='moritz'>
    <h3>each image local</h3>
    <dl>
        {{#each images}}
        <dt>data: {{caption}}</dt>
        <dd>transform: {{secretPassword}}</dd>
        {{/each}}
    </dl>

    <h3>each image server transformed</h3>
    <dl>
        {{#each transformed}}
        <dt>data: {{caption}}</dt>
        <dd>transform: {{secretPassword}}</dd>
        {{/each}}
    </dl>
</template>

if (Meteor.isServer) {

    Images = new Meteor.Collection('images', {
        transform: function (doc) {
            doc.secretPassword = 'XYZ'
            return doc
        }
    });

    Images.allow({
        insert: function (userid, doc) {
            return true;
        }
    });

    if (Images.find().count() < 1) {
        Images.insert({ caption: 'LOLCATZ RULZ'});
    }

    Meteor.publish('images', function () {
        return Images.find();
    })

    Meteor.methods({
        'transformed': function() {
            return Images.find().fetch();
        }
    })
}
else {
    Images = new Meteor.Collection('images');

    imageSub = Meteor.subscribe('images');

    Template.moritz.helpers({
        'images': function () {
            console.log(Images.find().count() + ' images')
            return Images.find();
        },
        'transformed': function () {
            // Should be separated, call should be in route for example
            Meteor.call('transformed', function(err,data){
               Session.set('transformed', data);     
                });
            return Session.get('transformed');
        }
    });
}  
于 2013-09-04T18:54:26.873 に答える
0

Jim Mack は、DB データと追加の「変換」プロパティをセッション変数に保存することがいかにうまく機能するかを証明する良い例をここで作成しました。残念ながら、この例には反応性がなく、Meteor の魔法の再レンダリング後に必要な「変換」を実行しません。そこで私は彼のクールなコードを手に入れ、反応性を追加しました。これは非常にうまく機能するスリムなコードですが、効率の点では Jim Mack の例よりも優れています。

lolz.html

<head>
  <title>lolz</title>
</head>

<body>
  {{>myItems}}
</body>

<template name="myItems">
    <h3>Reactive Item List with additional properties</h3>
    <button id="add">add</button>
    <button id="remove">remove</button>
    <dl>
        {{#each items}}
            <dt>data: {{caption}}</dt>
            <dd>added property: {{anotherProp _id}}</dd>
        {{/each}}
    </dl>
</template>

lolz.js

items = new Meteor.Collection('Items');

if (Meteor.isServer) {
    items.allow({
    insert: function (userid, doc) {
        return true;
    },
    remove: function(userid,doc){
        return true;
    }
  });
  while(items.find().count()>0){
    items.remove(items.findOne()._id);
  }
  while (items.find().count() < 3) {
        items.insert({caption: 'LOLCATZ RULZ'});
    }
  Meteor.publish('Items', function () {
      return items.find();
  });
  Meteor.methods({
        'getAdditionalProps': function() {
            additionalProps={};
        items.find().forEach(function(doc){
            additionalProps[doc._id]=reverse(doc.caption);
      });
      return additionalProps;
    }
  });

    function reverse(s){ // server side operation, i.e. for security reasons
    return s.split("").reverse().join("");
    };
}

if (Meteor.isClient){
    Meteor.subscribe('Items');

    Meteor.startup(function(){
        getAdditionalProps();
        itemsHandle=items.find().observe({
            added : function(doc){
                getAdditionalProps();
            },
            removed : function(doc){
                getAdditionalProps();
            },
            changed : function(docA,docB){
                getAdditionalProps();
            }
        });
    });

    Template.myItems.rendered=function(){
        console.log(new Date().getTime());
    };

    Template.myItems.items=function(){
        return items.find();
    }

    Template.myItems.anotherProp=function(id){
        return Session.get('additionalProps')[id];
    }

    Template.myItems.events({
        'click #add':function(e,t){
            items.insert({caption: 'LOLCATZ REACTZ'});
        },
        'click #remove':function(e,t){
            items.remove(items.findOne()._id);
        }
    });
}

function getAdditionalProps(){
    setTimeout(function(){
        Meteor.call('getAdditionalProps',function(error,props){
            Session.set('additionalProps',props);
        });
    },0);
}
于 2013-09-05T12:18:38.927 に答える
0

Meteor Streamsを見てください。クライアントでコレクションを使用しなくても、サーバーからクライアントに何かを直接送信できます。

取得したメッセージで何かを行うことができます (流星群サイトの例を使用しています)。

クライアント

chatStream.on('message', function(message) {
    if(message.expiry > new Date()) {
        //Do something with the message (not being read from a collection)
    }
});

保存しないように意図してこれを行う場合でも、単純なツール (Chrome インスペクター) が [ネットワーク/Websocket] タブ (SSL 経由で暗号化されている場合でも) にアクセスし、生データが通過するのを確認できることに注意してください。

あなたの意図はよくわかりませんが、これがどのシナリオでもセキュリティのためである場合は、クライアントから取得したデータを決して信頼しないでください.

于 2013-09-03T08:21:29.213 に答える