根据用户是否登录 Meteor 设置不同的路由

Setting different routes dependent on if user logged in Meteor

我正在努力为账户持有人和客人设置不同的主路线模板。我似乎无法根据用户是否登录来呈现不同的模板(两个不同的导航栏)。我已经为客人设置了模板

//guest.js 
<template name="unregistered">
       {{>navUnreg}}
  <div class="container">
      {{>about}}
  </div>
</template>

<template name="navUnreg">
    <nav class="navbar navbar-default">
      <div class="container">
        <ul class="nav navbar-nav">
          <a class="navbar-brand" href="#">CabStack</a>
        </ul>
        <ul class="nav navbar-nav navbar-right">
           {{>loginButtons}}
        </ul>
      </div>
    </nav>
</template>

这是未登录用户的通用关于页面。然后我有已登录帐户用户的模板是 -

//UserLoggedIn.js
<template name="cabMaster">
    {{>cabNav}}
  <div class="container">
    {{>yield}}
  </div>
</template>

我最初尝试将 if/else 语句放入路由器配置中 -

//config.js
Router.configure({
  if(Meteor.user()){
    layoutTemplate: "cabMaster"
  }
  else{
    layoutTemplate: "unregistered"
  }
});

但是,我一直收到错误消息。我已经在 userLoggedIn.js 页面上使用 Router.onBeforeAction 来限制对路由的访问,直到填写了个人资料页面

//Access rights for logged in users
function userNoAccess(){
  if(!Meteor.userId()){
    alert("restricted until profile page completed");
    this.render(“profile”);
    return pause();
  } else {
    this.next();
  }
}

//Do not allow access to nav links until user has filled out ‘profile’ page. 
Router.onBeforeAction(userNoAccess, {
  only: ["dashboard", "edit_dashboard", "help"]
});

所以

我确实考虑过将 userLoggedIn 路由放在我的 client.js 文件中的 Accounts.onLogin() 函数中,但我想将所有路由放在一个地方。有没有人对我如何实现这一目标有任何建议。谢谢

有几种方法可以解决这个问题。例如,您不必在路由器中执行所有操作。导航栏的选择可以直接在您的模板中进行:

<template name="navBar">
  {{#if currentUser}}
    {{> navReg}}
  {{else}}
    {{> navUnreg}}
  {{/if}}
</template>

当您尝试更改布局的小部分而不切换整个布局时,这非常方便。

我建议您考虑使用 控制器 来处理经过身份验证和未经身份验证的路由。它们使您的路由代码更易于维护。我写了一个 basic tutorial 可能对你有帮助。