0

みんな。

システムのこの部分に疑問があります。ユーザーからデータベースへのメッセージを暗号化し、ユーザーに表示するときにそれらを復号化したいのです (これはプライバシー上の理由からです)。ネイティブの暗号化/復号化ライブラリやさらに優れたソリューションが見つからなかったため、「crypto-js」( https://code.google.com/p/crypto-js/)、これまでのところうまく機能しています。問題は、ユーザーがメッセージを書き込むときに、メッセージを暗号化してデータベースに保存することです。しかし、テンプレート ヘルパーの "find" メソッドを使用してデータベースからそのメッセージを取得すると (リアクティブ計算のアイデアを使用して、目的の "ライブ HTML" にアプローチします)、得られるのはメッセージのレンダリングに使用される単なるカーソルです。私のHTMLで。ご覧のとおり、メッセージは復号化されずに表示されます。カーソルからデータを「フェッチ」し、すべてのメッセージに対して「for ループ」で復号化関数を実行することを考えていましたが、それは非効率的です。レンダリングする前にカーソルからデータを操作する方法を誰かが知っているかどうか疑問に思っていました。そうすれば、各メッセージをその場で復号化できます。

ご清聴ありがとうございました。

4

3 に答える 3

1

関連するコードをここに投稿していませんが、次のようなことをしたと思います。

Template.yourTemplate.yourHelper = function(){
    return yourCollection.find({});
}

問題は、データをカーソルの形でヘルパーに返すことです。これは、一般的に完全に受け入れられます。ただし、暗号化されたメッセージをコレクションに保存しているため、各メッセージは復号化を実行せずにそのままレンダリングされます。

したがって、カーソルの代わりに配列をフェッチしてみてfind().fetch()ください。これにより、カーソルと同等の配列が得られます。何かのようなもの :

Template.yourTemplate.yourHelper = function(){
      var msg_arr = yourCollection.find({}).fetch(); // gives array instead of cursor.

      msg_arr.forEach( function( msg ){ 
         // traverse through each element of array and
         // perform decryption.
      });
}
于 2013-07-19T07:32:12.983 に答える
1

#meteor IRC チャンネルで話をしたところ、いくつかのアイデアが出てきました。そして、これが私の場合の最良の解決策だと思いました:

{{#each messages}}
    {{decrypt}}
{{/each}}

ヘルパーがコンテキストからデータを取得すると、ヘルパーの「復号化」はループ内の実際の「メッセージ」を「this」オブジェクトとして取得します。次に、復号化を行い、メッセージをプレーン テキストで返しました。それはかなりうまく機能し、さらに反応的に呼び出され、カーソルを利用します(展示中にデータが変更された場合、動的に更新されます)。

私を助けてくれたみんなに感謝します。

于 2013-07-19T08:29:39.897 に答える