gpt4 book ai didi

Meteor Iron Router 首先进入路由的 waitOn 而不是 Router.onBeforeAction

转载 作者:行者123 更新时间:2023-12-04 19:40:23 25 4
gpt4 key购买 nike

我有 Meteor Roles 包,我正在尝试定义管理路由:

var requireLogin = function() {
if (! Meteor.user()) {
debugger // #1
if (Meteor.loggingIn()) {
this.render(this.loadingTemplate);
} else {
console.log("no user");
this.render('AdminLogin');
}
} else {
this.next();
}
};

Router.onBeforeAction(requireLogin, {only: ['AdminMain']});

Router.route('/admin', {
name: 'AdminMain',
layoutTemplate: 'AdminLayout',
waitOn: function(){
debugger // #2
return [
Meteor.subscribe("appointments")
]
}
});

我在服务器/出版物中得到了这个:

Meteor.publish('appointments', function() {
if (Roles.userIsInRole(this.userId, ['assistant','admin'])) {
return Appointments.find();
} else {
console.log("no user");
return [];
}
});

第一个 启动的调试器是 waitOn 中的调试器 #2。为什么?我为该路线精确指定了一个 OnBeforeAction。根据 Iron Router 指南,当用户导航到“/admin”时,我们的 onBeforeAction Hook 函数将在我们的路由函数之前运行。如果用户未登录,路由函数将永远不会被调用,AdminPage 也不会呈现到页面。

嗯,考虑到调试器首先停止以等待 Meteor 订阅,看起来路由函数确实在 OnBeforeAction 之前被调用。由于此订阅需要管理员用户登录服务器,如果我在调试器上按继续,服务器控制台会记录“无用户”并且加载屏幕会永远持续下去。 requireLogin 的实际 OnBeforeAction 函数永远不会被调用。

最佳答案

waitOn 在 OnBeforeAction 之前调用。这种行为是正确的。来自 iron-router 文档:

Another alternative is to use waitOn instead of subscribe. This has the same effect but automatically short-circuits your route action and any before hooks (see below), and renders a loadingTemplate instead.

Source

要处理订阅,您可以使用“订阅”选项:

Router.route('/post/:_id', {
subscriptions: function() {
// returning a subscription handle or an array of subscription handles
// adds them to the wait list.
return Meteor.subscribe('item', this.params._id);
},

action: function () {
if (this.ready()) {
this.render();
} else {
this.render('Loading');
}
}
});

Source

关于Meteor Iron Router 首先进入路由的 waitOn 而不是 Router.onBeforeAction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27622393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com