Meteor 如何在渲染光标指向的数据之前对其进行操作

Meteor 如何在渲染光标指向的数据之前对其进行操作,meteor,Meteor,大家好 我对我的系统的这一部分有一个疑问:我想对从用户到数据库的一些消息进行加密,并在向用户显示时对它们进行解密(这只是出于隐私原因)。因为我找不到任何本机的加密/解密库,甚至找不到更好的解决方案,所以我使用了“crypto js”(),到目前为止它工作得很好。问题是:当用户编写消息时,我会对其进行加密并将其保存在数据库中。但是,当我使用模板助手中的“find”方法从数据库检索消息时(使用反应式计算思想来接近所需的“livehtml”),我得到的只是一个光标,将用于在HTML中呈现消息。正如您所

大家好

我对我的系统的这一部分有一个疑问:我想对从用户到数据库的一些消息进行加密,并在向用户显示时对它们进行解密(这只是出于隐私原因)。因为我找不到任何本机的加密/解密库,甚至找不到更好的解决方案,所以我使用了“crypto js”(),到目前为止它工作得很好。问题是:当用户编写消息时,我会对其进行加密并将其保存在数据库中。但是,当我使用模板助手中的“find”方法从数据库检索消息时(使用反应式计算思想来接近所需的“livehtml”),我得到的只是一个光标,将用于在HTML中呈现消息。正如您所看到的,消息显示时不需要解密。 我想在从游标“获取”数据时,在“for循环”中对所有消息运行decrypt函数,但这太低效了。 我想知道,如果有人知道如何在呈现光标之前操作光标中的数据,那么我将能够动态解密每条消息


非常感谢您的关注,很抱歉给您带来麻烦。

您可以使用转换功能。在使用光标时传递转换,因此它仅在使用时在每个文档上运行:

YourCollection.find({}, {transform:function(doc) {

    var encrypted = doc.field1;
    doc.field1 = decrypt(encrypted)

    return doc;

});

所以现在每个
field1
都将被解密(在web浏览器上)。就在它被使用之前。如果您使用
.fetch()
,您也将获得所有解密的数据。

您可以使用转换函数。在使用光标时传递转换,因此它仅在使用时在每个文档上运行:

YourCollection.find({}, {transform:function(doc) {

    var encrypted = doc.field1;
    doc.field1 = decrypt(encrypted)

    return doc;

});

所以现在每个
field1
都将被解密(在web浏览器上)。就在它被使用之前。如果您使用
.fetch()
,您也将获得所有解密的数据。

您没有在此处发布相关代码,但我假设您已经执行了以下操作:

Template.yourTemplate.yourHelper = function(){
    return yourCollection.find({});
}
问题是,您正在以游标的形式将数据返回给助手,这在一般情况下是完全可以接受的。但当您在集合中存储加密消息时,每个消息都会按原样呈现,而不执行解密

因此,尝试获取一个数组,而不是使用游标,这样可以得到与游标等价的数组。比如:

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.
      });
}

您没有在此处发布相关代码,但我假设您已经做了如下操作:

Template.yourTemplate.yourHelper = function(){
    return yourCollection.find({});
}
问题是,您正在以游标的形式将数据返回给助手,这在一般情况下是完全可以接受的。但当您在集合中存储加密消息时,每个消息都会按原样呈现,而不执行解密

因此,尝试获取一个数组,而不是使用游标,这样可以得到与游标等价的数组。比如:

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.
      });
}
我刚刚在#meteor IRC频道进行了一次演讲,一些想法出来了。我认为这是对我来说最好的解决方案:

{{#each messages}}
    {{decrypt}}
{{/each}}
当助手从上下文中获取数据时,助手“decrypt”在循环中获取实际的“message”作为“this”对象。然后,我进行了解密并以纯文本形式返回消息。 它工作得很好,而且它被称为反应式的,并利用光标(如果在展览期间数据发生变化,则会动态更新)

谢谢所有帮助过我的人。

我刚刚在“流星IRC”频道进行了一次演讲,一些想法出来了。我认为这是对我来说最好的解决方案:

{{#each messages}}
    {{decrypt}}
{{/each}}
当助手从上下文中获取数据时,助手“decrypt”在循环中获取实际的“message”作为“this”对象。然后,我进行了解密并以纯文本形式返回消息。 它工作得很好,而且它被称为反应式的,并利用光标(如果在展览期间数据发生变化,则会动态更新)


谢谢所有帮助我的人。

谢谢,@Akshat!你的解决方案很有效!它的一个缺点是没有反应性地调用方法“transform”,这意味着在我的系统中没有动态更改:/但是这是一个很好的解决方案,它以某种方式工作。再次感谢!我不确定你的意思,它有点坐在中间,所以如果有一个反应性的变化,它也会随着新的变化而重新运行,所以它也应该被改变。你有关于你如何使用它的代码片段吗?嗨,@Akshat!嗯,我真的不知道这个反应式呼叫是如何深入工作的,但我只是说,因为我在文档网站上读到:“转换函数不是被动调用的。如果你想给一个对象添加一个动态变化的属性,那么使用一个在调用它时计算值的函数,而不是在转换时计算属性。”然后我认为可能有某种机制阻止数据通过“转换”“在响应式呼叫中起作用。大概但我真的不知道。但真的谢谢你@是的,这是真的!但它不适用于您,因为您没有使用被动属性,即从另一个集合引用的属性。因此,如果您更改了转换的内容(如果没有转换,则会有所不同),输出也会更改-这对于解密数据来说就像您使用它的方式一样是的,您是对的,@Akshat!我工作也很好!非常感谢您的支持!:)谢谢,阿克沙!你的解决方案很有效!它的一个缺点是没有反应性地调用方法“transform”,这意味着在我的系统中没有动态更改:/但是这是一个很好的解决方案,它以某种方式工作。再次感谢!我不确定你的意思,它有点坐在中间,所以如果有一个反应性的变化,它也会随着新的变化而重新运行,所以它也应该被改变。你有关于你如何使用它的代码片段吗?嗨,@Akshat!嗯,我真的不知道这个被动调用是如何深入工作的,但我只是说,因为我在文档网站上读到了这一点:“转换函数不是被动调用的。如果你想给一个对象添加一个动态变化的属性,用一个计算