如何避免Express路由部分匹配时r1中间件被错误触发?
解决方法
问题出在你给r1路由实例全局绑定了中间件——只要请求路径匹配r1的挂载前缀/wherever,就会触发这个中间件,哪怕后续请求被其他路由处理。要实现/wherever/else/b可用但不触发r1中间件,有两种常用方案:
方案一:将r1中间件仅绑定到特定路由
把中间件和r1的/a路由绑定在一起,这样只有访问/wherever/a时才会触发中间件:
const express = require('express'); const app = express(); const r1 = express.Router(); // 直接将中间件作为路由处理链的一部分 r1.get('/a', (req, res, next) => { console.log('r1 middleware'); next(); // 必须调用next()才能进入后续处理函数 }, function (req, res) { return res.send('x'); }); const r2 = express.Router(); r2.get('/b', function (req, res) { return res.send('y'); }); app.use('/wherever', r1); app.use('/wherever/else', r2); app.use('/elsewhere', r2); app.listen(8080, function(){ console.log('Server ready'); });
方案二:给r1中间件指定匹配路径
给r1的中间件添加路径限制,让它只匹配/a相关路径:
const express = require('express'); const app = express(); const r1 = express.Router(); // 仅当请求路径在r1上下文中为/a时,才执行中间件 r1.use('/a', (req, res, next) => { console.log('r1 middleware'); next(); }); r1.get('/a', function (req, res) { return res.send('x'); }); const r2 = express.Router(); r2.get('/b', function (req, res) { return res.send('y'); }); app.use('/wherever', r1); app.use('/wherever/else', r2); app.use('/elsewhere', r2); app.listen(8080, function(){ console.log('Server ready'); });
两种方案都能实现:访问/wherever/else/b时正常返回y且不会触发r1的中间件;访问/wherever/a时仍会触发r1中间件并返回x。另外注意,原代码中r1的中间件没有调用next(),会导致请求挂起,上述方案都补上了这个必要步骤。
内容的提问来源于stack exchange,提问作者zaitsman
相关产品推荐
相关产品推荐

