2015-01-20 5 views
1

ServiceConfiguration 컬렉션을 일련의 설정과 동기화하고 싶습니다. 나는 (거의)과 같이 사용하여이 observeChanges을 달성했습니다두 개의 Meteor 컬렉션 동기화하기

var handle = Settings.find().observeChanges({ 
    changed: function (id, post) { 
     var insert = {}; 
     post.hostName && (insert.host = post.hostName); 
     post.domainName && (insert.domain = post.domainName); 

     ServiceConfiguration.configurations.update({service: "xmpp"}, insert); 
    } 
}); 

Meteor.publish("Settings", function() { 
    this.onStop = function() { 
     handle.stop(); 
    }; 

    return Settings.find(); 
}); 

이 코드의 문제는 그러나 출판의 onStop 방법이없는 경우 클라이언트 연결을 끊습니다, 바로라는 점이다. 그 콜백을 사용하는 이유는 Meteor 문서가 수동으로 observeChanges 핸들을 취소하는 중요성을 강조하고 있기 때문입니다. 그러나이 방법을 취소하면 실제로 콜렉션의 변경 사항을 관찰 할 수 없습니다. 그러나 코드가 작동하지 않으면 잘 동작합니다. stop() 핸들.

그래서 핸들을 멈출 수 없습니까, 아니면 메모리 누수가 생길 수 있습니까? 또는 두 개의 Meteor 컬렉션을 동기화 상태로 유지하려면 어떻게해야합니까?

답변

1

TL/DR - 예, 삭제 하셔도됩니다.

올바르게 이해하면 여러 사용자가 "설정"발행물을 구독하고 Settings 컬렉션의 설정을 변경할 수 있으며이를 자동으로 ServiceConfiguration 컬렉션에 전파해야하는 상황입니다.

이 경우 모든 사용자가 모든 변경 사항을 모니터링하도록 설계된 글로벌 구성이므로 관찰자를 중지하려고하면 안됩니다. 게시 중단시 obeever를 중지해야하는 경우는 관찰자가 에서 게시 기능인 사이에서 실행될 때이므로 연결된 모든 사용자에 대해 생성 된 새 알림이 있습니다. 이런 상황에서 관찰자를 멈추지 않으면 동일한 사용자가 반복적으로 연결하고 연결을 끊을 수 있으므로 잠재적으로 무제한으로 실행중인 관찰자가 남게되어 앱이 사망하게됩니다.

그러나 여기에서는 구독 클라이언트 수와 독립적으로 실행되는 옵저버 만 있습니다. 또한 개별 출판물이 중단 될 때 중지 할 수 없습니다. 변경을 계속할 수있는 다른 클라이언트 가입자가 계속있을 수 있기 때문입니다.

요약하면 onStop 블록을 제거해도됩니다. 그게 말이되지 않는 경우 알려주십시오.

2

matb33:collection-hooks을 사용하여 컬렉션에 대한 업데이트를 수신 할 수 있습니다. 이 될 것이다 서버 측 :

Settings.after.update(function(userId, doc, fieldNames, modifier, options){ 
    var insert = {}; 
    //...your logic 
    ServiceConfiguration.configurations.update({service: "xmpp"}, insert); 
}); 

확인 https://github.com/matb33/meteor-collection-hooks

관련 문제