Javascript 路由问题,未收集请求参数

Javascript 路由问题,未收集请求参数,javascript,node.js,express,mongoose,Javascript,Node.js,Express,Mongoose,我正在为一个项目制作一个维基百科克隆。我的初始编辑路线如下所示: router.get('/edit/:id', function(req, res){ var id = req.params.id; console.log(id); models.Page.findById(id, function(err, doc){ console.log(doc); res.render('edit', {page: doc}); })

我正在为一个项目制作一个维基百科克隆。我的初始编辑路线如下所示:

router.get('/edit/:id', function(req, res){
    var id = req.params.id;

    console.log(id);

    models.Page.findById(id, function(err, doc){
        console.log(doc);
        res.render('edit', {page: doc});
    });

});
我所做的只是为一个id为id参数的页面创建一个编辑页面视图。 直到

我不得不添加这条新路线:

router.get('/:url_name/:id', function(req,res){
    var id = req.params.id;

    models.Page.findById(id, function(err, doc){
        res.render('show_page', {page: doc});
    });
});
现在,当我激活这个路由时,我的edit/:id页面路由不会收集id参数(req.params.id)

我不知道为什么这不起作用,也不知道应该从哪里开始调试,因为我没有收到任何错误,它仍然会将我带到我的编辑/:id页面,但当我控制台.log(id)时,我没有收到任何值,甚至没有收到任何未定义的值。此外,找不到我传递给编辑视图的{page:doc}

如果有人能提供见解或一个开始寻找调试的地方,我将不胜感激。只是提醒一下,当我没有激活:url\u name/:id路由时,edit/:id路由将按它应该的方式工作(req.params.id获取id)

现有路线-

我添加了
var wiki_routes=require('./routes/wiki')在我的app.js中,在该路径中,我有:

// **** URL ROUTES ****

router.get('/', function(req, res) {
  models.Page.find(function(err, docs) {
    res.render('index', { docs: docs });
  });
});

router.get('/:url_name', function(req, res){
    var url_name = req.params.url_name;
    var isUpdated = req.query.updated;
    var updated = (isUpdated === 'true')?true:false;

    models.Page.find({url_name: url_name}, function(err, page){
        if(page.length > 1){
            console.log(page);
            res.render('disambiguation', {pages: page, updated: updated });

        } else {
            console.log(page);
        res.render('show_page', {page: page[0], updated: updated});
        }
    });
});

router.get('/:url_name/:id', function(req,res){
    var id = req.params.id;

    models.Page.findById(id, function(err, doc){
        res.render('show_page', {page: doc});
    });
});

// **** EDIT ROUTES ****

router.get('/edit/:id', function(req, res){
    var id = req.params.id;

    console.log(id);

    models.Page.findById(id, function(err, doc){
        console.log(doc);
        res.render('edit', {page: doc});
    });

});

router.post('/edit_submit/:id', function(req, res){
    var id = req.params.id;
    var new_title = req.body.title;
    var new_body = req.body.body;

    console.log(req.body);

    models.Page.findByIdAndUpdate(id, {title: new_title, body: new_body }, function(err, docs){
    // redirects to the wiki page
    res.redirect('/wiki/'+ docs.url_name +'?updated=true');
    });
});

// **** DELETE ROUTE ****

router.get('/delete/:id', function(req, res){
    var id = req.params.id;

    models.Page.findByIdAndRemove(id, function(err, data){
        res.redirect('/?deleted=true');
    });
});

路由是在代码中出现时设置的,因为节点将显示它首先遇到的任何路由,所以在设置路由时,顺序非常重要。
一个URL可能会匹配多个路由,特别是在使用捕获大量不同URL的变量或静态路由等时

在你的例子中,你有一个URL

该URL肯定会被此路由捕获

router.get('/:url_name/:id' ....
因为它与
http://example.com/something/something
layout,它也会被以下路径捕获

router.get('/edit/:id', ....
因为它与
http://example.com/edit/something
布局

哪个路由实际包含URL取决于它们在设置时遇到的顺序,无论哪个首先声明的路由都将捕获URL

在大多数情况下,只要改变路线的顺序就可以解决这样的问题

// if the URL matches, this will execute first
router.get('/edit/:id', function(req, res){ 
     // do stuff
});

// You'll only get here if the URL doesn't match the above route
router.get('/:url_name/:id', function(req, res){
     // do stuff
});
router.get('/:url_name/:id', function(req, res, next){

     if ( req.params.url_name == 'edit' ) {
         next(); // this sends the request back to look for routes below this one
     }else{
         // do stuff
     }

});

router.get('/edit/:id', function(req, res){
    // now we'll get here when the "url_name" is "edit" ...
});
如果您无法使用
next()
回调来交换路由,那么有一种解决方法,如下所示

// if the URL matches, this will execute first
router.get('/edit/:id', function(req, res){ 
     // do stuff
});

// You'll only get here if the URL doesn't match the above route
router.get('/:url_name/:id', function(req, res){
     // do stuff
});
router.get('/:url_name/:id', function(req, res, next){

     if ( req.params.url_name == 'edit' ) {
         next(); // this sends the request back to look for routes below this one
     }else{
         // do stuff
     }

});

router.get('/edit/:id', function(req, res){
    // now we'll get here when the "url_name" is "edit" ...
});

你把新路线放在编辑路线之前了吗?如果是这样的话,它会抓住所有的东西。Hey adeneo,我不太清楚你在编辑路线之前所说的“新路线”是什么意思。以下是我从my/wiki路由器的所有路由。我把它们添加到我的问题中。交换位置,移动
router.get(“/:url_name/:id”…
编辑
路线之后,不要抓住编辑的url”这样做,把所有路线放在最后,否则他们会做他们应该做的事情,抓住一切。哇,非常感谢@adeneo。你知道任何资源或者这个“路线捕捉”指的是什么吗?我是一个开发新手d这是我的第一个项目。我不知道会发生这种情况,而且在路由器中创建路由时顺序很重要。此外,我很乐意为您的答案提供支持。请作为答案发布,以便我:)