2013-07-19 83 views
0

everyone。如何在渲染之前操作光标指向的数据

我对我的系统的这一部分有疑问:我想将用户的一些消息加密到数据库,并在向用户显示时进行解密(这仅仅是为了保护隐私)。由于我找不到任何本机加密/解密库或更好的解决方案,因此我正在使用“crypto-js”(https://code.google.com/p/crypto-js/),并且目前运行良好。问题是:当用户编写消息时,我将其加密并将其保存在数据库中。但是,当我使用模板助手中的“find”方法从数据库中检索该消息时(使用响应式计算思路来处理所需的“Live HTML”),我所得到的只是一个将用于呈现消息的游标在我的HTML。正如您所看到的,该消息显示不被解密。 我正在考虑从游标中“获取”数据,在所有消息的“for循环”中运行解密函数,但效率太低。 我想知道如果有人知道我如何在渲染之前从光标操作数据,那么我将能够即时解密每条消息。

真的非常感谢您的关注和对不起任何麻烦。

回答

1

我刚刚在#meteor IRC频道上发表了一些演讲,并提出了一些想法。而且我认为这个人是我的情况下,最好的解决办法:

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

当帮手得到从上下文中的数据,帮手“解密”获环路实际的“消息”作为“此”对象。然后,我做了解密并以纯文本的形式返回了消息。 它工作得很好,进一步称之为被动地使用光标(如果数据在展览期间发生变化,则会动态更新)。

谢谢大家帮助我。

+0

如果你打电话给客户端解密,你是不是也公开揭露你的公钥? –

3

您可以使用转换函数。因为它被用作光标被使用,因此它只能在每个文档运行传递的变换:

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

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

    return doc; 

}); 

所以现在每个field1将被解密(在网页浏览器)。在它被使用之前。如果你使用.fetch(),你也可以得到所有的解密数据。

+0

谢谢,@Akshat!你的解决方案运作良好关于它的一个坏处是,“变换”方法不被称为被动方式,这意味着在我的系统中不会动态变化:但是这是一个很好的解决方案,它以某种方式工作。再次感谢! – jhonatanoliveira

+0

我不确定你的意思,它的位置在中间,所以如果发生反应性变化,它也会随着新变化而重新运行,所以它也应该反应性地改变。你有如何使用它的代码片段? – Akshat

+0

嗨,@Akshat!那么,我真的不知道这个被动调用是如何工作的,但我刚刚说过,因为我在文档网站上看到这个: “转换函数不是被动地调用的,如果你想为一个对象添加一个动态变化的属性,用一个函数来计算它在被调用时的值,而不是在转换时计算该属性。“ 然后我认为可能有某种机制阻止数据通过反应调用中的“变换”功能。也许......但我真的不知道。但真的很感谢你! – jhonatanoliveira

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

嘿,@sohel khalifa,感谢您的关注!正如我在我的问题中所说的那样,我注意到了你的观察结果,我很确定它可能运作良好。坏事是关于表现。我很担心这种“反循环”的反应方法......:/ 但我喜欢它,如果我没有找到更好的方法,我肯定会使用它。再次感谢! – jhonatanoliveira