仅给nptelRoutes配置的requireAuth中间件全局生效问题求助
问题分析与解决方案
问题描述
我创建了requireAuth中间件并导入至app.js,同时从routes文件夹导入所有路由文件(每个路由文件包含多条链式路由)。原本仅想为nptelRoutes配置该中间件,让它仅作用于/nptel、/nptel/answer、/nptel/videos这类路由,但实际该中间件却作用于整个应用的所有路由。
相关代码
requireAuth中间件代码
const jwt = require('jsonwebtoken'); const { User } = require('../models/users'); const requireAuth = (req, res, next) => { const token = req.cookies.jwt; // 检查JSON Web Token是否存在并验证 if (token) { jwt.verify( token, '***********', (err, decodedToken) => { if (err) { res.redirect('/login'); } else { next(); } } ); } else { res.redirect('/login'); } }; module.exports = requireAuth;
app.js路由配置代码
// Authentication routes const userAuth = require('./routes/authRoute'); // 导入所有路由 const homeRoutes = require('./routes/home'); const profile = require('./routes/profile'); const seoRoute = require('./routes/seo'); const semRoutes = require('./routes/sem'); const nptelRoutes = require('./routes/nptel'); app.use('/', userAuth); app.use('/', homeRoutes); app.use('/', projectRoute); app.use('/', profile); app.use('/', seoRoute); app.use('/', requireAuth, nptelRoutes);
问题原因
问题出在app.use('/', requireAuth, nptelRoutes)这一行:Express的路径匹配采用前缀匹配规则,当你传入根路径/时,所有HTTP请求都会匹配该路径,导致requireAuth中间件被应用到后续所有路由上,而不仅仅是nptelRoutes的路由。
修复方案
方案一:为nptelRoutes指定专属路径前缀
修改app.js中的路由挂载代码,给nptelRoutes指定/nptel前缀,这样中间件只会作用于以/nptel开头的路由:
// 替换原来的nptelRoutes挂载代码 app.use('/nptel', requireAuth, nptelRoutes);
同时需要确保routes/nptel.js内的路由定义为相对路径,比如:
// routes/nptel.js router.get('/', (req, res) => { /* 处理/nptel请求 */ }); router.get('/answer', (req, res) => { /* 处理/nptel/answer请求 */ }); router.get('/videos', (req, res) => { /* 处理/nptel/videos请求 */ });
方案二:在nptelRoutes内部挂载中间件
直接在routes/nptel.js中挂载requireAuth中间件,让它仅作用于该路由文件内的所有路由:
// routes/nptel.js const requireAuth = require('../middleware/requireAuth'); // 路径根据实际项目结构调整 router.use(requireAuth); // 中间件作用于当前路由实例的所有路由 // 定义路由 router.get('/', (req, res) => { ... }); router.get('/answer', (req, res) => { ... }); router.get('/videos', (req, res) => { ... });
之后在app.js中正常挂载nptelRoutes即可:
app.use('/', nptelRoutes);
内容的提问来源于stack exchange,提问作者Vinit P. Jain
相关产品推荐
相关产品推荐

