我正在开发一个多租户应用程序,我不确定如何有条件地加载路由。
我有:
var tenant = resolveTenant();
if (tenant === null) {
Router.configure({
layoutTemplate: 'main',
notFoundTemplate: 'not-found'
})
Router.route('home', {
path: '/'
})
Router.route('newClient', {
path: 'signup'
})
} else {
Router.configure({
layoutTemplate: 'storeMain',
notFoundTemplate: 'not-found'
})
Router.route('storeHome', {
path: '/'
})
}
因此,如果租户无法解析,请加载主站点。
这很好用,不漂亮,但很好。但问题是租户不存在时。
案例:
为了做到这一点,我需要调用数据库。所以我用条件调用将条件包装在一个方法调用中:
Router.configure({
layoutTemplate: "loading"
});
var tenant = resolveTenant();
Meteor.call("tenant.exists", tenant, function(err, exists) {
if (tenant !== null && !exists) {
Router.configure({
layoutTemplate: 'noTenant'
})
Router.route('noTenant', {
path: '/'
})
} else if (tenant === null) {
Router.configure({
layoutTemplate: 'main',
notFoundTemplate: 'not-found'
})
Router.route('home', {
path: '/'
})
Router.route('newClient', {
path: 'signup'
})
} else {
Router.configure({
layoutTemplate: 'storeMain',
notFoundTemplate: 'not-found'
})
Router.route('storeHome', {
path: '/'
})
}
})
问题是,在调用完成后,它是否不会从加载模板配置中移出。如果我删除加载模板路由,我会得到铁路由器登陆页面。
完成后,这里是“tenant.exists”方法:
"tenant.exists": function(url){
if(url === null){
return false
}
return Tenants.find({"url": url}).count() > 0;
},
关于如何实现这一目标的任何想法?
修改
我确实尝试从方法调用中删除条件并在客户端运行查询。但是,当它不应该时,计数总是返回0。
if (tenant !== null && Tenants.find({"url": tenant}).count() === 0) {
Router.configure({
layoutTemplate: 'noTenant'
})
Router.route('noTenant', {
path: '/'
})
} else if (tenant === null) {
Router.configure({
layoutTemplate: 'main',
notFoundTemplate: 'not-found'
})
Router.route('home', {
path: '/'
})
Router.route('newClient', {
path: 'signup'
})
} else {
Router.configure({
layoutTemplate: 'storeMain',
notFoundTemplate: 'not-found'
})
Router.route('storeHome', {
path: '/'
})
}
答案 0 :(得分:1)
请允许我建议一种更简单的方法,也可以避免向所有客户发布所有租户的名称,同时避免Meteor.call()
的异步副作用:
onBeforeAction
处理程序中,查看是否存在租户记录,如果是,则继续,否则呈现相应的页面。路由器:
var tenant = resolveTenant();
Router.route('/',{
name: 'storeHome',
onBeforeAction: function(){
if ( Tenants.findOne() ) this.next();
else if ( tenant ) this.render('noTenant');
else this.render('signup');
},
waitOn: function(){
return Meteor.subscribe('tenant', tenant);
}
});
服务器:
Meteor.publish('tenant',name,function(){
check(name,String);
return Tenants.find({ url: tenant });
});
取自模式here。