2013-07-19 3 views
0

모두.렌더링 전에 커서로 가리키는 데이터를 조작하는 방법

나는이 시스템에서 의심의 여지가 있습니다. 사용자로부터 데이터베이스로 보낸 일부 메시지를 암호화하고 사용자에게 다시 표시 할 때 암호를 해독하려고합니다 (개인 정보 보호상의 이유로). 어떤 원시 암호화/해독 라이브러리 나 더 나은 솔루션을 찾을 수 없기 때문에 "crypto-js"(https://code.google.com/p/crypto-js/)를 사용하고 있으며 현재까지는 잘 작동합니다. 문제는 사용자가 메시지를 쓸 때이를 암호화하여 데이터베이스에 저장하는 것입니다. 그러나 템플릿 헬퍼의 "찾기"메서드를 사용하여 데이터베이스에서 해당 메시지를 검색 할 때 (반응 적 계산 아이디어를 사용하여 원하는 "Live HTML"에 접근), 메시지를 렌더링하는 데 사용할 커서 만 있습니다. 내 HTML에. 보시다시피 메시지는 해독되지 않고 표시됩니다. 커서에서 데이터를 "가져 와서"모든 메시지에 대해 "for 루프"에서 해독 기능을 실행한다고 생각했지만 너무 비효율적입니다. 커서를 렌더링하기 전에 커서의 데이터를 조작하는 방법을 알고 있으면 각 메시지를 즉시 해독 할 수 있는지 궁금합니다.

관심을 가져 주셔서 감사 드리며 불편을 끼쳐 드려 죄송합니다.

답변

1

방금 ​​IRC 채널에 대한 의견이 나왔습니다. 몇 가지 아이디어가 나왔습니다. 그리고 나는이 하나가 최고의 내 경우에 대한 해결책이 생각 : 헬퍼 상황에서 데이터를 얻을으로

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

이 도우미는 "해독"A "이"개체로 루프의 실제 "메시지"를 가지고 . 그런 다음 암호 해독을 수행하고 일반 텍스트로 메시지를 반환했습니다. 꽤 잘 작동하고, 더 나아가 반응 적으로 호출되어 커서를 사용합니다 (전시 중에 데이터가 변경되면 동적으로 업데이트됩니다).

나를 도왔던 모든 분들께 감사드립니다.

+0

클라이언트 쪽에서 decrypt를 호출하는 경우 실제로 decyption 키를 공개하지 않으시겠습니까? –

3

변환 기능을 사용할 수 있습니다. 그것이 사용되는대로 커서가 사용되는대로 각 문서에 실행되도록 전달됩니다 변환 : 이제 각 field1가 (웹 브라우저)의 암호를 해독 할 것이다

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

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

    return doc; 

}); 

합니다. 그것이 사용되기 바로 전에. .fetch()을 사용하면 모든 해독 된 데이터도 받게됩니다.

+0

감사합니다. @Akshat! 당신의 솔루션은 잘 작동합니다! 그것에 관한 한 가지 나쁜 점은 "변형"메서드가 반응 적으로 호출되지 않고 내 시스템에서 동적으로 변경되지 않는다는 것입니다./ 그러나 이는 좋은 해결책이며 특정 방식으로 작동합니다. 다시 한 번 감사드립니다! – jhonatanoliveira

+0

나는 당신이 어떤 의미인지 모르겠다. 중간에 앉아있다. 반응 변화가 있다면 그것은 또한 새로운 변화로 재실행되기 때문에 반응 적으로도 변화해야한다. 어떻게 사용하고 있는지에 대한 코드 스 니펫이 있습니까? – Akshat

+0

안녕하세요, @ Akkat!글쎄, 난 정말이 반응 호출이 깊이 작동하는지 모르겠지만, 나는 설명서 웹 사이트에서 이것을 읽었 기 때문에 이렇게 말했습니다 : "변환 함수는 반응 적으로 호출되지 않습니다. 객체에 동적으로 변경되는 속성을 추가하려면, 변환 할 때 속성을 계산하는 것이 아니라 호출 할 때의 값을 계산하는 함수로 처리하십시오. " 그러면 데이터가 반응 호출의 "변환"기능을 통과하지 못하게하는 메커니즘이 있다고 생각합니다. 어쩌면 ...하지만 나는 정말로 모른다. 하지만 정말 고마워요! – 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, 당신의 관심에 감사드립니다! 나는 나의 질문에서 말했듯이 당신의 관찰을 보았고 그것이 잘 작동 할 것이라고 확신합니다. 나쁜 것은 성능입니다. 반응적인 방법으로 "for loop"에 대해 걱정하고 있습니다. :/ 하지만 나는 그것을 좋아하고 더 나은 방법을 찾지 못한다면 확실히 사용할 것입니다. 다시 한 번 감사드립니다! – jhonatanoliveira

관련 문제