Ошибка Meteor Blaze с помощником по шаблону

Большинство моих помощников по шаблонам приводят к ошибкам с пламенем, и я не уверен, почему. Что делает их более странными, так это то, что они вообще не блокируют рендеринг или события из шаблонов, на самом деле приложение работает нормально.

Основная проблема - беспорядочная консоль. Пример этого ниже:

Template.templatename.helpers({
    adminhelper: function(){
        var theUser = Meteor.user(),
            theUserId = theUser['_id'];

        if(theUserId == "XXX"){
            return true;
        }
    }
});

Это всего лишь один способ проверить, какой пользователь является администратором. Это приводит к:

Exception in template helper: TypeError: Cannot read property '_id' of undefined
    at Object.Template.templatename.helpers.adminhelper (http://localhost:3000/client/lib/helpers.js?37db222f849959237e4f36abdd8eba8f4157bd32:5:23)
    at http://localhost:3000/packages/blaze.js?77c0809654ee3a10dcd5a4f961fb1437e7957d33:2693:16
    at http://localhost:3000/packages/blaze.js?77c0809654ee3a10dcd5a4f961fb1437e7957d33:1602:16
    at Object.Spacebars.call (http://localhost:3000/packages/spacebars.js?3c496d2950151d744a8574297b46d2763a123bdf:169:18)
    at Template.manage.Blaze.If.HTML.HEADER.HTML.DIV.class (http://localhost:3000/client/views/template.templatename.js?868248757c652b031f64adad0edec9e2a276b925:6:22)
    at null.<anonymous> (http://localhost:3000/packages/blaze.js?77c0809654ee3a10dcd5a4f961fb1437e7957d33:2454:44)
    at http://localhost:3000/packages/blaze.js?77c0809654ee3a10dcd5a4f961fb1437e7957d33:1795:16
    at Object.Blaze._withCurrentView (http://localhost:3000/packages/blaze.js?77c0809654ee3a10dcd5a4f961fb1437e7957d33:2029:12)
    at viewAutorun (http://localhost:3000/packages/blaze.js?77c0809654ee3a10dcd5a4f961fb1437e7957d33:1794:18)
    at Tracker.Computation._compute (http://localhost:3000/packages/tracker.js?192a05cc46b867dadbe8bf90dd961f6f8fd1574f:288:36)

Интересно, что client / views / template.templatename.js не существует. Я помещаю всех помощников в файл helpers.js, а все события - в файл events.js.

Для моего маршрута у меня есть

Router.route('/theurl',function(){
    this.render('templatename');
},{
    waitOn: function(){
        return Meteor.user();
    }
});

Что я могу сделать, чтобы избежать этих проблем в будущем?


person thatgibbyguy    schedule 15.12.2014    source источник


Ответы (1)


Просто используйте охранник, чтобы проверить наличие Meteor.user() перед извлечением _id. Ожидание Meteor.user() в маршруте не работает, поскольку waitOn требует подписки. В качестве альтернативы вы можете просто сделать это:

Template.templatename.helpers({
  adminhelper: function() {
    return Meteor.userId() === 'XXX';
  }
});

Еще лучшее решение - использовать пакет ролей.

person David Weldon    schedule 15.12.2014
comment
Ах! Спасибо! Этот пакет ролей будет спасением для моих производственных приложений. - person thatgibbyguy; 15.12.2014