2013-01-06 3 views
1

클라이언트의 모음에 자동 가입하고 있습니다. 내 코드는 아래와 같습니다. 나는 클라이언트가 업데이트 된 정보를 가지길 기대하지만 결코 업데이트하지 않는다. 이 문제는 페이지를 새로 고치지 않으면 메시지로 대체되지 않는 단추에 나타납니다.테스트 컬렉션이 업데이트되지 않는 이유는 무엇입니까?

'Tests'컬렉션에 대한 하나의 문서는 클라이언트의 testCount 속성을 1로 업데이트해야하지만, 페이지를 새로 고침하지 않으면 절대로 발생하지 않습니다. 업데이트하지 않겠습니까?

자동 게시 패키지가 설치되어 있지 않습니다.

이 시점에서 나는 Meteor에 버그가 있다는 것을 확신합니다. 또는 나는 단지 근본적인 것을 이해하지 못합니다. Meteor.js의 dev 버전을 설치하려고합니다. Meteor.js가 실제로 작동 할 때까지 그냥 포기해야합니다. : P

내 콘솔 로그 :

Tests updated! 
checking test 
no test 
Tests updated! Object {_id: "ea9f6002-74c7-4f37-9f10-0167b3b6f65a", testCount: 0} 
checking test result 
test.testCount 0 

내 서버 로그 :

$ meteor reset;meteor 
Project reset. 
[[[[[ ~/Dropbox/projects/sphela-game/sphela ]]]]] 

Running on: http://localhost:3000/ 
inserting new test 
Connecting test, getting initial data. 
Test added do nothing { testCount: 0, _id: 'ea9f6002-74c7-4f37-9f10-0167b3b6f65a' } 
Connecting test, getting initial data. 
Test added do nothing { testCount: 0, _id: 'ea9f6002-74c7-4f37-9f10-0167b3b6f65a' } 
Running test. 
Updating test to 1. 
Test ran. { testCount: 1, _id: 'ea9f6002-74c7-4f37-9f10-0167b3b6f65a' } 
Test added do nothing { testCount: 1, _id: 'ea9f6002-74c7-4f37-9f10-0167b3b6f65a' } 

내 HTML :

<head> <title>Testing counts.</title> </head> 

<body> {{> app}} </body> 

<template name="app"> 
    {{#if testSuccess}} 
    <h1>Test complete.</h1> 
    {{else}} 
    <button class="btn run-test">Run Test</button> 
    {{/if}} 
</template> 

내 자바 스크립트 :

var Tests = new Meteor.Collection('tests'); 

if (Meteor.isClient) { 
    Meteor.startup(function() { 
    Session.set('testCount', 0) 
    Meteor.subscribe('connect'); 
    }); 
    Template.app.testSuccess = function() { 
    var test; 
    console.log('checking test result'); 
    test = Tests.findOne(); 
    if (!test) { 
     console.log('no test', test); 
     return false; 
    } 
    console.log('test.testCount', test.testCount); 
    return test.testCount > 0; 
    }; 
    Template.app.events({ 
    'click .run-test': runTest 
    }); 
    function runTest(event) { 
    Meteor.call('runTest'); 
    Session.set('testCount', 1); 
    } 
    Meteor.autorun(function() { 
    console.log('Tests updated!', Tests.findOne()); 
    }); 
    Meteor.autosubscribe(function() { 
    Meteor.subscribe('test-results', Session.get('testCount')); 
    }); 
} 

if (Meteor.isServer) { 
    Meteor.startup(function() { 
    test = Tests.findOne({}) 
    if (!test) { 
     test = { 
     testCount: 0 
     }; 
     console.log('inserting new test'); 
     test._id = Tests.insert(test); 
    } else { 
     console.log('startup reset'); 
     test.testCount = 0; 
     Tests.update({_id:test._id}, test); 
    } 
    }); 

    Meteor.publish('connect', function() { 
    var test_; 
    console.log('Connecting test, getting initial data.'); 
    test_ = Tests.findOne({}); 
    this.set('tests', test_._id, test_); 
    this.complete(); 
    this.flush(); 
    }); 

    Meteor.publish('test-results', function(test) { 
    var handle; 
    handle = Tests.find({testCount: test}).observe({ 
     changed: _.bind(function(test) { 
     console.log('Test changed', test._id, test.testCount); 
     this.set('tests', test._id, test); 
     this.flush(); 
     }, this), 
     added: _.bind(function(test) { 
     console.log('Test added do nothing', test); 
     this.flush(); 
     }, this) 
    }); 
    this.complete(); 
    this.flush(); 
    this.onStop(function() { 
     handle.stop(); 
    }); 
    }); 
    Meteor.methods({ 
    runTest: function() { 
     var test; 
     console.log('Running test.'); 
     test = Tests.findOne({}); 
     test.testCount = 1; 
     console.log('Updating test to 1.'); 
     Tests.update({_id: test._id}, test); 
     console.log('Test ran.', Tests.findOne()); 
    }, 
    }); 
    } 

답변

3

유성에서 나오미 (Naomi at meteor)가 실제로 Google 그룹 메일 링리스트에서 내 질문에 대한 답변을 얻었습니다. 내 문제의 요지는 두 개의 구독/반환 된 충돌하는 결과 집합 게시 및 하나는 무시되었습니다.

이것은 documenation에 실제로 나는 그것을 놓친 : 값

개 이상 가입이 속성에 대한 충돌하는 값 전송 (같은 컬렉션 이름, 문서 ID, 그리고 속성 이름) 경우, 다음 클라이언트에서 첫 번째 서브 스크립 션 부터 활성화 될 것입니다. (가 중복 속성을 보낼 첫 번째없는 경우에도 마찬가지입니다.)

대답은 문을 게시 여러에서 결과 집합을 반환하지 않는 것입니다 서로 충돌하는. 나는 같은 컬렉션을 돌려 보내지 않는 것이 이것을 피하는 데 도움이 될 것이라고 생각합니다.

당신이보고있는 동작은 유성에서 관찰에서 사용자 정의를 기반으로 출판사를 쓰는 몇 가지 세부 사항으로 가져옵니다

나오미의 전체 대답은 [1]과 같습니다.

당신이보고있는 것은 여러 구독이 작동하는 방식의 결과라고 생각됩니다. 여기 내가 생각하는 것이 있습니다. 초기는, 서버가 다운 보내는 게시 세션 변수 수를 0 "수집 테스트는 testCount가 0 인 아이디 ea9f6002-74c7-4f37-9f10-0167b3b6f65a과 개체있다", 그래서 testCount가 0이고 우리는 테스트 결과를 구독 위대한 데이터베이스의 로컬 버전은 이미 은 모든 구독이 동의하며 변경이 필요 없다고 생각합니다. 세션 변수 개수가 1로 업데이트됩니다. 자동 수신은 가서 을 testCount가 1 인 테스트 결과에 구독합니다. 이제 개의 게시자가 있습니다. '연결'이라고 생각하면 ea9f6002-74c7-4f37-9f10-0167b3b6f65a에는 testCount가 0 인 경우 (결코 이 업데이트되면 어떻게 다르게 생각할 수 있습니까?) 'test-results'는 'added'메시지를 표시합니다. ea9f6002-74c7-4f37-9f10-0167b3b6f65a에는 testCount가 있습니다. 새로운 메시지가 나타나면 메시지가 나타납니다. 나중에 커서가 일치하는 항목이 변경되면 '변경됨'메시지가 표시됩니다. - 메시지가 추가 된 메시지는 과 같습니다. 당신은 '변경된'메시지를 기대하고있었습니다. 대신. 여기서 전체적인 결과는 ea9f6002-74c7-4f37-9f10-0167b3b6f65a가 testCount가 0이고 게시자가 게시자가 없다고 말하는 게시자가 있기 때문에 클라이언트가 생각합니다. ea9f6002-74c7-4f37-9f10- 0167b3b6f65a 클라이언트가 testCount는 것을보고 확실히 0

의 testCount을가 0이 아닌 것을 말해야한다 컬렉션의 문서 ea9f6002-74c7-4f37-9f10-0167b3b6f65a에 대해 아무것도 주장하는 모든 출판사 testCount가 0이 아니며 적절한 설정 및 플러시 호출이 있습니다. 관찰의 추가 콜백에서 testCount가 1이라는 메시지를 보낸 경우에도 Meter는 이 문서의 값과 충돌하는 두 가지 다른 항목에 가입 할 때 클라이언트가 무엇을 보는지에 대해 아무 것도 보장하지 않습니다.

tl; dr version : 항목이 이미 데이터베이스에 있더라도 커서를 관찰하면 처음으로 실행될 때마다 관찰 된 세트의 모든 내용이 추가 된 콜백을 얻습니다. 여러 발행인이 동일한 문서에 동일한 키를 게시하는 경우에는 클라이언트가 보는 버전이 하나이지만, Meteor는 에 대한 보증을하지 않습니다. 게시자가 동의하지 않는 경우는 하나입니다. 여러 게시자가 문서의 내용에 대해 동의하지 않도록 설정하면 혼란을 일으킬 수 있습니다.

[1] https://groups.google.com/forum/?fromgroups=#!topic/meteor-talk/KBhXK6a44kY

1

이 문제는 페이지를 새로 고침하지 않는 한 메시지로 바뀌지 않는 버튼에 나타납니다. 전체

테스트 :

코드를 실행하고 버튼을 클릭 이 버튼은 다음으로 대체됩니다.

그리고 콘솔 표시 :

checking test result testcount.js:10 
test.testCount 1 

나는 나의 IDE로 자바 스크립트 파일을 붙여 넣은 후 하나의 오류를 발견; runTest() 메서드의 닫는 중괄호 뒤에 쉼표. 그러나 내가 할 수있는 한 테스트를 실행할 때 부정적인 영향을 미치지 않았습니다.

+0

당신이 autopublish 패키지 설치가 있었나요? –

+0

완전히 잊어 버렸습니다. 제거한 후에도 나는 당신과 같은 경험을합니다. –

+0

그럼 버그인가요? –

관련 문제