Javascript 添加路由器以按个人查看帖子';流星的名字

Javascript 添加路由器以按个人查看帖子';流星的名字,javascript,meteor,iron-router,Javascript,Meteor,Iron Router,我是网络开发新手,我正在学习Meteor。我几乎是在遵循《发现流星》这本书,但当我稍微偏离一点时,我会出错 以下代码工作正常,permalink的工作原理与预期的一样: 路由器.js Router.configure({ layoutTemplate: 'layout', loadingTemplate: 'loading', waitOn: function() {return Meteor.subscribe('allPosts')} }); Router.map(funct

我是网络开发新手,我正在学习Meteor。我几乎是在遵循《发现流星》这本书,但当我稍微偏离一点时,我会出错

以下代码工作正常,permalink的工作原理与预期的一样:

路由器.js

Router.configure({
  layoutTemplate: 'layout',
  loadingTemplate: 'loading',
  waitOn: function() {return Meteor.subscribe('allPosts')}
});


Router.map(function() { 
    this.route('postsList', {path: '/'});

    this.route('postPage', {
        path: '/posts/:_id',
        data: function(){return Posts.findOne(this.params._id)}
    });
});

Router.onBeforeAction('loading');
但是,当我将以下内容添加到Router.map时,它无法正常工作:

this.route('byName',{
    path: '/posts/:name',
    data: function(){return Posts.findOne({name: this.params.name})}
})
为了清楚起见,我将显示我的模板:

<template name = 'byName'>
    {{> postItem}}
</template>

<template name = 'postPage'>
    {{> postItem}}
</template>
我得到同样的职位。但是当我按名字点击时,我得到

Name: , Post: See Post, By Name

没有填写任何值。我做错了什么?谢谢。

尝试向每个路由的数据参数添加
console.log()
语句……如下所示:

     this.route('postPage', {
          path: '/posts/:_id',
          data: function(){
            console.log("route -> postPage")
            return Posts.findOne(this.params._id)
          }
      });

      this.route('byName',{
          path: '/posts/:name',
          data: function(){
            console.log("route -> byName");
            return Posts.findOne({name: this.params.name})
          }
      });
我想你会看到这个问题的。我真的不确定你想用你的例子实现什么,所以我不确定是否有一个具体的方法来解决你的问题。但是,我将提供一个选项,因此您可以看到以下选项将起作用:

  this.route('byName',{
      path: '/posts/name/:name',
      data: function(){
        console.log("route -> byName");
        return Posts.findOne({name: this.params.name})
      }
  });
注意我是如何给它一个不同的匹配路径的吗

在您的示例中,您的路径本质上是相同的(由于参数名的原因,它们看起来不同,但它们都指向
/posts/
)。当iron router在路由中运行以正确处理路径时,它会首先遇到与模式匹配的
postPage
路由。该路由查找单个
Post
,其
\u id
等于某个字符串(传递的
名称
),结果为空。您可以切换定义路由的顺序(将
byName
置于
postPage
之上),然后
byName
将起作用,另一个将为空

希望有帮助

     this.route('postPage', {
          path: '/posts/:_id',
          data: function(){
            console.log("route -> postPage")
            return Posts.findOne(this.params._id)
          }
      });

      this.route('byName',{
          path: '/posts/:name',
          data: function(){
            console.log("route -> byName");
            return Posts.findOne({name: this.params.name})
          }
      });
  this.route('byName',{
      path: '/posts/name/:name',
      data: function(){
        console.log("route -> byName");
        return Posts.findOne({name: this.params.name})
      }
  });