2014-02-20 3 views
1

По какой-то нечетной причине iron-router случайным образом возвращает неопределенные значения.Iron-Router, случайно возвращающийся в Meteor

this.route('pollyShow', { 
    path: '/polly/:_id', 
    template: 'polly_show', 
    notFoundTemplate: 'notFound', 
    before: function() { 
     var id = this.params._id; 
     var poll = Polls.findOne({_id: id}); 
     console.log(poll); 
     var ip_array = poll.already_voted; 
     $.getJSON("http://smart-ip.net/geoip-json?callback=?", function(data){ 
      ip_voted = ip_array.indexOf(data.host); 

      if (ip_voted > -1) { 
       Router.go('pollyResults', {_id: id}); 
      } 
     }); 
    }, 
    data: function() { 

     return Polls.findOne({_id: this.params._id}); 
    } 
}); 

Иногда он возвращается нормально, а в другое время он просто возвращает неопределенный.

Есть ли причина этого?

+1

Я боюсь, что не понимаю: что возвращается как «неопределенный» здесь? –

+0

Я имею в виду 'poll'' undefined' в console.log (poll); это то, что возвращается под 'data: function() {..}' – user1952811

+0

Использование console.log Я вижу, что по какой-то причине это фактически не определено. – user1952811

ответ

0

Проблема возникает из-за того, что коллекция Polly иногда заселена и в другое время остается незаселенной при выполнении маршрута.

Эта проблема может быть предотвращена явно waiting on a subscription с использованием опции waitOn в конфигурации маршрута.


Из docs:

By default, a new Meteor app includes the autopublish and insecure packages, which together mimic the effect of each client having full read/write access to the server's database. These are useful prototyping tools, but typically not appropriate for production applications. When you're ready, just remove the packages.

Чтобы удалить пакеты, звоните meteor remove <package-name>.

Затем вам нужно явно публиковать записи, которые вы хотите видеть на клиента на сервере:

сервера/publications.js:

Meteor.publish('all_of_polly', function() { return Polls.find({}); }); 

И подписаться на него на стороне клиента:

this.route('pollyShow', { 
    path: '/polly/:_id', 
    template: 'polly_show', 
    notFoundTemplate: 'notFound', 
    waitOn: function() { return Meteor.subscribe('all_of_polly'); } 
    // ... 
}); 
+0

По какой-то причине это не работает для меня, давая мне ошибку в консоли. 'Uncaught TypeError: undefined не является функцией' Вот что я получил в коде: http://pastebin.com/bdS2xYwE – user1952811

+0

Вы определяете свою коллекцию _after_ загружается маршрут? Они должны быть в отдельном файле, который работает как на клиенте, так и на сервере. Кроме того, это поможет узнать, что было 'undefined'. –

+0

Файл 'route.js' не находится ни в каталоге клиента, ни в каталоге сервера. Он находится в главном каталоге приложения. Что касается того, что называется неопределенным, это строка 'Опросы = новый Meteor.collection ('polls_all');' не уверен, что случилось. У меня есть эта строка выше 'Meteor.subscribe ('polls_all');' – user1952811

Смежные вопросы