铁路由器 - 取决于租户的条件路由

时间:2016-04-04 10:50:11

标签: meteor 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: '/'
        })
    }

因此,如果租户无法解析,请加载主站点。

这很好用,不漂亮,但很好。但问题是租户不存在时。

案例:

为了做到这一点,我需要调用数据库。所以我用条件调用将条件包装在一个方法调用中:

    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: '/'
      })
  }

1 个答案:

答案 0 :(得分:1)

请允许我建议一种更简单的方法,也可以避免向所有客户发布所有租户的名称,同时避免Meteor.call()的异步副作用:

  1. 订阅租户订阅,将租户名称作为参数
  2. 在相应的出版物中,只返回一个匹配的租户
  3. onBeforeAction处理程序中,查看是否存在租户记录,如果是,则继续,否则呈现相应的页面。
  4. 路由器:

    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