Express.js如何让指定路由脱离当前路由器的前缀约束?
解决方法:让特定路由脱离Express Router前缀(无需修改app.js)
现有代码
app.js
var app = express(); app.use('/my-page', require('./routes/my-page.js'));
my-page.js
const router = require('express').Router(); router.get('/one', function (req, res, next) { return res.send('this is /my-page/one'); }); router.get('/my-other-page', function (req, res, next) { return res.send('this is /my-other-page'); });
需求
让my-other-page路由脱离/my-page前缀,直接映射到根路径/my-other-page,且不修改app.js。
实现方案
利用Express请求对象的req.app属性获取主应用实例,在第一次请求时将目标路由注册到全局app上,后续请求直接走全局路由,无需经过Router前缀。
修改后的my-page.js代码如下:
const router = require('express').Router(); // 保留原有带前缀的路由 router.get('/one', function (req, res, next) { return res.send('this is /my-page/one'); }); // 仅注册一次全局路由 let isRegistered = false; router.use((req, res, next) => { if (!isRegistered) { // 获取主应用实例 const app = req.app; // 注册脱离前缀的路由 app.get('/my-other-page', function (req, res) { return res.send('this is /my-other-page'); }); isRegistered = true; } next(); }); // 可选:删除原Router中对应的路由,避免/my-page/my-other-page仍可访问 // router.get('/my-other-page', ...) 此行代码可删除 module.exports = router;
说明
- 当第一个请求进入
/my-page前缀下的任意路由时,中间件会触发,完成全局路由的注册,之后不会重复执行。 - 访问
/my-other-page会直接命中全局路由,不再携带/my-page前缀;/my-page/one仍保持原有前缀正常访问。 - 如果不需要保留
/my-page/my-other-page的访问路径,直接删除原Router中对应的路由定义即可。
内容的提问来源于stack exchange,提问作者stackers
相关产品推荐
相关产品推荐

