我设置了/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
模板,对吧?
答案 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
将失败,这将使你的应用无限期等待。 onBeforeAction
在waitOn
您需要检查发布中的所有变量以确保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