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

Javascript 使用/和/:slug作为不同的路由文件表示动态路由,javascript,node.js,express,url-routing,Javascript,Node.js,Express,Url Routing,因此,我正在重构我的node/express应用程序,并试图分离我的根。这是我的问题: 我想要一个主页,然后是一个完全不同的网页扩展,这不属于其他路线 例如,假设我有3个页面:主页、关于,然后是一个用户页面,其中URL是“mysite.com/username123” 现在我知道(或至少相信)这可以通过以下方式实现: var express = require('express'); var router = express.Router(); router.get('/:slug', func

因此,我正在重构我的node/express应用程序,并试图分离我的根。这是我的问题:

我想要一个主页,然后是一个完全不同的网页扩展,这不属于其他路线

例如,假设我有3个页面:主页、关于,然后是一个用户页面,其中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;
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);
但这不是我想做的;我想把它们保存在两个不同的路由文件中。因此,我的app.js文件将包含以下内容:

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;
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);
其中,
/users
在有slug时渲染。这实际上是一种工作。如果没有
:slug
,则加载索引文件,否则加载用户文件(路由文件中有:slug,此处未显示)。但是
/about
会被覆盖

现在我想我可以把
/about
推到列表的顶部,这样做会起作用,但这似乎非常草率,这样做的全部目的是正确地构造我的代码


这种情况应该如何妥善处理?有人能在这里给我一些帮助吗?

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

解决办法可能是:

  • 添加url参数以使express区分路由

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

  • 跳到下一条路线

    router.get(':slug', function (req, res, next) {
       if (req.params.slug === 'about') {
          return next();
    }
    
      // get user data and render
      res.render('user', userdata);
    });
    

  • /about
    路线附在此下方。

    只需按此顺序重新安排路线即可

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

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

    发生这种情况是因为
    /about
    /:slug
    覆盖。换句话说,express无法判断
    about
    是否不应该成为一个slack。我明白为什么会这样。我只需要知道我应该如何解决这个问题,同时将
    /:slug
    保存在一个单独的文件中,而不是在
    /
    的主页中。您需要向用户的路由添加一些内容。例如:
    router.get(“/users/:id”
    `但是我没有/users/页面,我也不想要一个。我希望用户名出现在域的后面。Ian在这种情况下,你可以使用
    /:folder
    并通过签入
    req.params.folder
    if/else
    条件进行路由。这不是我所希望的优雅解决方案,但这就是问题所在我现在就同意。如果没有人能在未来24小时内提出一个更干净的解决方案(如果有的话),我会投票将其作为解决方案。谢谢,非常感谢。这是我能想到的最好的解决方案。如果你发现一个更优雅的解决方案,请发帖