使用/和/:slug将动态路由表示为不同的路由文件

时间:2015-06-17 07:55:33

标签: javascript node.js express url-routing

所以我正在重构我的节点/表达应用程序,我正试图分离我的根。这是我的问题:

我想要一个主页,然后是一个完全不同的扩展页面,不会落入其他路径。

例如,假设我有3个页面:Homepage,About,然后是一个URL为“mysite.com/username123”的用户页面。

现在我知道(或者至少相信)这可以通过以下方式来实现:

var express = require('express');
var router = express.Router();
router.get('/:slug', function(req, res, next) {
    if(req.params.slug) {
        var data = { 
            my: 'data'
        };
        res.render('index', data);
    } else {
        var userdata = { 
            my: 'data'
        };
        res.render('user', userdata);
    }
});
module.exports = router;

但这不是我想要做的;我想将它们保存在两个不同的路径文件中。所以我的app.js文件会有类似的内容:

var routes = require('./routes/index');
var users = require('./routes/users');
var about = require('./routes/about');

app.use('/', index);
app.use('/', users);
app.use('/about', about);

如果有一个slug,/users会呈现。这实际上是有效的。如果没有:slug,则加载索引文件,否则加载用户文件(路由文件中有:slug,此处未显示)。但是/about被覆盖了。

现在我认为我可以将/about推到列表的顶部,这样可行,但这看起来非常草率,这样做的重点是正确构建我的代码。

这样的情况应该如何妥善处理?有人可以在这里给我一些帮助吗?

2 个答案:

答案 0 :(得分:3)

这是因为/about/:slug覆盖了。换句话说,快递无法判断about是否不是slug

解决方案是

  1. 添加网址参数以区分路线。

    router.get('/users/:slug')

  2. 跳至下一条路线

    router.get(':slug', function (req, res, next) {`
       if (req.params.slug === 'about') {
          return next();
    }
    
      // get user data and render
      res.render('user', userdata);
    });
    
  3. 在此下方附加/about路线。

答案 1 :(得分:2)

只需按此顺序重新排列路线

app.use('/about', about);
app.use('/', users);

静态路由优先于动态路由。