Я работаю над многопользовательским приложением, и я не уверен, как загружать маршруты условно.Iron Router - Условные маршруты в зависимости от арендатора
Я имел:
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: '/'
})
}
Так, если арендатор не может быть решен, загрузите основной сайт.
Это работало отлично, не красиво, но прекрасно. Однако проблема заключается в том, что арендатор не существует.
Корпус:
- http://localhost/ - Загрузить главный
- http://store1.localhost/ - магазин нагрузки
- http://notastore.localhost/ - Загрузить шаблон notTenant.
Для этого мне нужно позвонить в базу данных. Поэтому я завернул условие внутри метод вызова с обратным вызовом:
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: '/'
})
}
У меня сложилось впечатление, что в вызове метода может возникнуть какая-то проблема ..вы могли отлаживать и видеть, отвечает ли вызов метода, как вы ожидаете? –
Да все как и ожидалось, возвращает true, если существует, false, если нет. Я попытался удалить условия из вызова метода и сделал «Tenants.find» ({«url»: tenant}). Count() === 0', но вызов продолжал возвращать true (так как ни один арендатор, найденный с этим URL-адресом), любые идеи о том, почему это было бы? Я слишком долго не делал Метеор. –
Если вы выполняете запрос на стороне клиента, есть ли там вся коллекция Tenants? Просто попробуйте запросить коллекцию в консоли браузера и проверьте, что там публикуется: Tenants.find(). Fetch(); –