关于Express Generator生成项目的Express Router路由配置技术咨询
Express Router 路由配置与管理指南(基于Express Generator项目)
看起来你已经用Express Generator搭好了项目框架,并且已经引入了几个路由文件,下面我就详细讲讲怎么正确配置和管理Express Router,让你的路由结构更清晰、易维护:
一、先梳理你的现有代码基础
你提供的app.js片段已经完成了路由模块的引入,先把这段代码补全并格式化展示:
var createError = require('http-errors'); var express = require('express'); var path = require('path'); var cookieParser = require('cookie-parser'); var logger = require('morgan'); // 引入自定义路由模块 var indexRouter = require('./routes/index'); var usersRouter = require('./routes/users'); var detailRouter = require('./routes/user-detail'); var app = express(); // view engine setup(补全Express Generator默认的视图引擎配置) app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); // 假设你用默认的ejs引擎,也可以换成pug等
二、Express Router 完整配置步骤
1. 编写独立的路由文件
每个路由模块对应routes目录下的一个文件,比如你的./routes/user-detail.js,需要按照Express Router的规范编写:
// ./routes/user-detail.js var express = require('express'); var router = express.Router(); // 创建路由实例 // 定义GET请求:访问/user-detail/123时触发 router.get('/:id', function(req, res, next) { // 通过req.params.id获取URL中的参数 res.render('user-detail', { title: '用户详情页', userId: req.params.id }); }); // 定义POST请求:处理用户详情更新 router.post('/update', function(req, res, next) { // 从req.body获取表单提交的数据 const userData = req.body; // 这里可以加数据库操作逻辑 res.send(`已更新用户信息:${JSON.stringify(userData)}`); }); // 导出路由实例,供app.js引入 module.exports = router;
2. 在app.js中挂载路由
完成路由文件编写后,需要在主文件中通过app.use()把路由挂载到指定路径下,补全你的app.js代码:
// ... 前面的代码保持不变 ... // 配置全局中间件(Express Generator默认生成) app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); // 挂载路由:指定每个路由模块对应的根路径 app.use('/', indexRouter); // 根路径(/)下的请求交给indexRouter处理 app.use('/users', usersRouter); // /users开头的请求交给usersRouter处理 app.use('/user-detail', detailRouter); // /user-detail开头的请求交给detailRouter处理 // 错误处理中间件(Express Generator默认生成) app.use(function(req, res, next) { next(createError(404)); }); app.use(function(err, req, res, next) { res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; res.status(err.status || 500); res.render('error'); }); module.exports = app;
3. 进阶:路由的模块化与嵌套管理
如果项目规模变大,可以按业务模块拆分路由,甚至嵌套子路由:
比如把用户相关的路由都放到routes/users目录下:
routes/users/index.js(用户主路由)routes/users/detail.js(用户详情子路由)routes/users/profile.js(用户资料子路由)
然后在routes/users/index.js中挂载子路由:
// ./routes/users/index.js var express = require('express'); var router = express.Router(); var detailRouter = require('./detail'); var profileRouter = require('./profile'); // 挂载子路由:访问/users/detail/123时触发 router.use('/detail', detailRouter); // 访问/users/profile时触发 router.use('/profile', profileRouter); // 用户列表路由 router.get('/', function(req, res) { res.send('用户列表页面'); }); module.exports = router;
最后在app.js中只需要挂载主用户路由:
var usersRouter = require('./routes/users'); app.use('/users', usersRouter);
4. 给路由添加专属中间件
你可以给特定路由添加中间件,比如登录验证:
// 定义登录验证中间件 const checkLogin = function(req, res, next) { if (req.cookies.userId) { next(); // 已登录,继续执行路由逻辑 } else { res.redirect('/login'); // 未登录,跳转到登录页 } }; // 在路由中使用中间件 router.get('/profile', checkLogin, function(req, res) { res.render('user-profile'); });
内容的提问来源于stack exchange,提问作者harsh
相关产品推荐
相关产品推荐

