【问题标题】:Iron Router onBeforeAction isn't being calledIron Router onBeforeAction 未被调用
【发布时间】:2016-04-10 13:21:18
【问题描述】:

我设置了一个/user 路由,如果当前用户未登录,它应该呈现login 模板。整个路由器有一个waitOn 等待currentUser 订阅结束。问题是当我转到/user 时,它只是呈现dataNotFound 模板。

这是与这种情况相关的代码的 sn-ps。我一直小心翼翼地按照我在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 模板,对吧?

【问题讨论】:

    标签: meteor iron-router


    【解决方案1】:

    您的控制台日志甚至没有触发,这很奇怪。我有一些想法,但首先想解决你的最后一个问题。

    dataNotFound 插件会在你的溃败时触发 data 函数时触发。这意味着它完全绕过了你的 onBeforeAction 钩子,而不是它没有到​​达那里。

    我能想到的可能值得尝试的一件事是将“用户”路由操作包装在 if ( this.ready() ) 语句中:

    编辑:

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

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

    【讨论】:

    • 您能详细说明一下吗?我不确定您所说的“包装'用户'路线”是什么意思
    【解决方案2】:

    从流星 0.9.1 升级到 1 后,我遇到了 onBeforeAction 挂钩问题。 它没有在应该被解雇的时候被解雇。就像我注销后一样,我手动输入地址,而不是登录页面,我可以看到实际站点正在等待永远不会出现的数据。 onRun 钩子解决了它,但正如文档所说,它只被触发一次。

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

    【讨论】:

    • 是的,它第一次工作,但如果用户注销它又被破坏了。它必须是被动的:/
    【解决方案3】:

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

    【讨论】:

    • 恐怕没有效果:/
    【解决方案4】:

    我在这里找到了问题。

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

    可能在您注销时订阅currentUser 会失败,这将使您的应用程序处于无限等待状态。 onBeforeActionwaitOn 之后运行

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

    【讨论】:

      【解决方案5】:

      waitOn 函数中添加一个if 语句。

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

      请参阅此评论以了解发生这种情况的原因:https://github.com/iron-meteor/iron-router/issues/1010#issuecomment-72210587

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-25
        • 1970-01-01
        • 1970-01-01
        • 2016-01-31
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        相关资源
        最近更新 更多