【问题标题】:Meteor, define "standard route" for each userMeteor,为每个用户定义“标准路线”
【发布时间】:2018-06-21 07:20:41
【问题描述】:

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

【问题讨论】:

    标签: javascript meteor database-design meteor-blaze flow-router


    【解决方案1】:

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

    为此,您需要一个流星方法。此方法还检查当前用户是否为已登录和注册用户(因为客户端中的Meteor.user() 始终可以被操作。如果它是有效的iser,则该方法检索用户的列表文档并返回它是_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并将用户重定向到他/她的收件箱。

    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 模板集成到您在/(根)路径中呈现的模板中。我不鼓励这样做,因为它会带走一些灵活性,您可以将两个模板相互硬链接。

    【讨论】:

      猜你喜欢
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 2013-07-04
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多