Meteor,为每个用户定义"standard route"

Meteor, define "standard route" for each user

我目前正在开发某种待办事项应用程序。我可以通过访问 url 中的 id 参数轻松导航到任何列表,然后将其传递给 flowrouter,没问题。但是现在我希望像 "inbox" 这样的默认列表在导航到 localhost:3000 时始终是第一个屏幕,所以路由“/”。我有一个名为 "lists" 的数据库,我在其中保存了所有列表,还有列表 "inbox"。但是,如何定义访问“/”时导航到 http://localhost:300/lists/idOfListInbox 的路线?我考虑过在我的个人资料中保存这个特殊列表的 ID,但这不起作用,因为 Meteor.user() 在 flowrouter 的操作部分中没有自己的顶级字段,我不想使用会话或 cookie。有人知道如何解决这个问题吗?

假设你使用kadira:flow-router你可以定义一个trigger on enter。此函数在页面呈现之前运行,并允许检查某些状态,例如如果用户已登录。这也允许获取当前用户的收件箱 ID。

为此,您需要一个流星方法。此方法还检查当前用户是否是登录和注册用户(因为客户端中的 Meteor.user() 始终可以被操作。)如果它是有效的 iser,则该方法检索用户的列表文档和 returns 是 _id.

Meteor.methods({
    'getListByUser'() {
        // check user permission
        if (!this.userId || !Meteor.users.findOne(this.userId))
            throw new Error("permission denied");
        // get listId by userId
        return Lists.findOne({userId:this.userId})._id;
    }
});

注意:这只是一个示例,假设每个列表文档都通过一个名为 userId 的字段与用户相关联。在您的情况下,您需要以特定方式获取用户列表。

然后相应的路由调用triggersEnter服务器方法获取listId并将用户重定向到his/her收件箱。

FlowRouter.route('/', {
  // calls just before the action
  triggersEnter: [function(){
      Meteor.call("getListByUser", function(err, listId) {
          if (err) { /* handle err */ }
          if (listId) redirect('/lists/'+listId);
      });
  }],
  action: function() {
    // do something you like
  },
});

这可能是使用触发器输入的一种解决方案。还有另一种设计,一旦从根路径中的方法加载了 listId,就可以将 lists 模板集成到 /(根)路径中呈现的模板中模板。我不鼓励这样做,因为它会带走一些灵活性,你很难 link 两个模板彼此。