使用 / 和 /:slug 作为不同的路由文件来表达动态路由
Express dynamic routing using / and /:slug as different route files
所以我正在重构我的 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;
但这不是我想做的;我想将它们保存在两个不同的路由文件中。所以我的 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);
其中 /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('/:slug', users);
静态路由优先于动态路由。
所以我正在重构我的 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;
但这不是我想做的;我想将它们保存在两个不同的路由文件中。所以我的 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);
其中 /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('/:slug', users);
静态路由优先于动态路由。