大家。
我对我系统的这一部分有疑问:我想加密一些从用户到数据库的消息,并在向用户显示时解密它们(这只是出于隐私原因)。由于我找不到任何本机加密/解密库甚至是更好的解决方案,所以我使用的是“crypto-js”(https://code.google.com/p/crypto-js/),到目前为止它运行良好。问题是:当用户编写消息时,我对其进行加密并将其保存在数据库中。但是当我使用模板助手中的“查找”方法从数据库中检索该消息时(使用反应计算思想来接近所需的“实时HTML”),我得到的只是一个用于呈现消息的游标在我的HTML中。如您所见,消息显示时无需解密。 我在考虑从光标“获取”数据,在所有消息的“for循环”中运行decrypt函数,但这样效率太低。 我想知道是否有人知道如何在渲染之前操纵光标中的数据,然后我就能够动态解密每条消息。
非常感谢您的关注,对不起任何麻烦。
答案 0 :(得分:3)
您可以使用转换功能。转换在使用游标时传递,因此它仅在使用时在每个文档上运行:
YourCollection.find({}, {transform:function(doc) {
var encrypted = doc.field1;
doc.field1 = decrypt(encrypted)
return doc;
});
所以现在每个field1
都会被解密(在网络浏览器上)。就在它被使用之前。如果您使用.fetch()
,您也可以获得所有解密数据。
答案 1 :(得分: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.
});
}
答案 2 :(得分:1)
我刚刚在#meteor IRC频道进行了一次演讲,并提出了一些想法。我认为这个是我案例的最佳解决方案:
{{#each messages}}
{{decrypt}}
{{/each}}
当帮助者从上下文中获取数据时,帮助程序“decrypt”将循环中的实际“消息”作为“this”对象获取。然后,我做了解密并以纯文本形式返回了消息。 它工作得很好,进一步被称为反应性并利用光标(如果数据在展览期间发生变化则动态更新)。
感谢所有帮助过我的人。