铁路由器onBeforeAction未被调用

时间:2014-11-09 21:27:54

标签: meteor iron-router

我设置了/user路由,如果当前用户没有登录,则应该呈现login模板。整个路由器都有waitOn个等待currentUser订阅完成。问题是当我转到/user时,它只是简单地呈现dataNotFound模板。

这是与这种情况相关的代码片段。我已经按照他们在lib/router.js文件中定义的顺序向您显示了这些内容。

Router.plugin('dataNotFound', {notFoundTemplate: 'notFound'});

Router.onBeforeAction(function () {
    console.log(Meteor.userId())
    if (!Meteor.userId()) this.render('login');
    else this.next();
}, { only: ['user'] });

Router.configure({
    waitOn: function () { return Meteor.subscribe('currentUser'); }
});

Router.route('/user', {
    name: 'user',
    template: 'userView',
    data: function () { return Meteor.user(); }
});

上面的console.log甚至没有发射过。在我看来,因为它应该是一个反应函数,即使最初呈现dataNotFound,然后很快就会触发onBeforeAction并呈现login模板,对吧?

5 个答案:

答案 0 :(得分:1)

从流星0.9.1升级到1后,我遇到了onBeforeAction挂钩的问题。 它应该没有被解雇。就像我退出后,我手动输入地址而不是登录页面,我可以看到实际站点等待从未到来的数据。 onRun hook解决了它,但正如文档说它只被解雇了一次。

Router.onRun(function () {

    if (!Meteor.userId()) {
       this.render('login'); 
    } else { 
       this.next();
    }
}, { only: ['user'] });

答案 1 :(得分:1)

你的控制台日志甚至没有触发,这是非常奇怪的。我有一些想法,但首先要解决你问题的最后一部分。

当数据函数在您的路径上触发时,会触发dataNotFound插件。这意味着它完全绕过你的onBeforeAction钩子,而不是它没有到​​达那里。

我能想到的一件可能值得尝试的事情就是在if ( this.ready() )声明中包装'用户'路线动作:

编辑:

Router.route('user', { // Your other stuff action: function() { if this.ready() { this.render(); },

我建议这样做的原因只是你正在使用waitOn语句,但我不能100%确定如果你的路线中某处没有this.ready(),那是怎么回事,因为那就是(再次,从我阅读文档,没有摆弄它)告诉路由器在执行之前要等待什么。可能它现在还没有等待。

答案 2 :(得分:0)

尝试在if语句中使用Meteor.user()替换Meteor.userId()。请参阅此链接以获取有关如何处理之前过滤器中用户检查的参考:http://www.manuel-schoebel.com/blog/meteorjs-iron-router-filters-before-and-after-hooks

答案 3 :(得分:0)

我在这里找到了这个问题。

根据这个post,感谢Steeve Cannon。问题出在waitOn函数上。

可能当你登录时,订阅currentUser将失败,这将使你的应用无限期等待。 onBeforeActionwaitOn

之后运行

您需要检查发布中的所有变量以确保waitOn成功完成。

答案 4 :(得分:0)

if函数中放入waitOn语句。

waitOn: function () {
  if(Meteor.userId())
    return Meteor.subscribe('currentUser');
}

请参阅此评论以了解原因:https://github.com/iron-meteor/iron-router/issues/1010#issuecomment-72210587