我有一个这样的应用程序:
import express from 'express';
const middleware = tag => (req, res, next) => {
console.log('middleware ' + tag);
next();
};
const app = express();
const router = express.Router();
router.use(middleware('a'));
router.get('/x', (req, res) => res.json({ message: 'x' }));
app.use(router);
app.use(middleware('b'));
app.get('/y', (req, res) => res.json({ message: 'y' }));
app.use(middleware('c'));
app.listen(3000);
但是,Router
的行为不符合我的预期:
$ curl localhost:3000/x
中间件a
$ curl localhost:3000/y
中间件a
中间件b
为什么命中/y
调用中间件?我认为中间件仅适用于router
。
如何仅将中间件应用于router
,而不应用app
中的其他路由?
答案 0 :(得分:2)
即使您是通过路由器完成的,因为您随后连接了没有子路径的路由器,它将所有内容捆绑在一起。在您的示例中,您已将所有内容附加到同一父端点/
,因此即使通过路由器完成,您也可以将此路由器连接到/feature1/x
路径。
如果您只想将中间件分开,那么您有两种选择。
将端点转换为/feature2/y
和/feature1
之类的路径。将中间件分别附加到/feature2
和/x
。这将为您提供所需的结果。这可以通过以这种方式连接端点app.use('/feature1', router);
的路由器来完成:
/feature1/x
这意味着您现在拥有端点/y
和app.get('/x, middleware('a'), (req, res) => res.json({message: 'x'});
app.get('/y', middleware('b'), (req, res) => res.json({message: 'y'});
。每个触发它的独立中间件链。
将中间件附加到特定端点,例如:
/
您目前所做的是将所有内容附加到相同的路径路径(在本例中为顶级斜杠You can do it like this:
var caseOne = [
{"name":"Felicity", "gender":"F","type":"Admin"},
{"name":"Tony", "gender":"M","type":""},
{"name":"Super Man", "gender":"M","type":""},
{"name":"Wonder Women", "gender":"F","type":""},
{"name":"Hulk", "gender":"M","type":"User"},
{"name":"Loky", "gender":"M","type":"User"},
{"name":"Thore", "gender":"M","type":"Admin"}
];
var result =[];
var counterIndex = 0;
for(var i=0; i<caseOne.length; i++) {
if(caseOne[i].type == '')
counterIndex++;
}
result = caseOne.splice(counterIndex+1, caseOne.length);
console.log(result);
)。
答案 1 :(得分:1)
当你这样做时
app.use(router);
您将路由器安装在应用的根/
路径上。路由器的中间件
router.use(middleware('a'));
安装在根路径或路由器上,因此位于应用程序的根路径。安装在根路径的中间件将针对每个请求执行。
如何将中间件仅应用于路由器,而不应用于应用程序中的其他路由?
您可以将路由器安装在/x
并使路由器处理/
其根路径:
router.get('/', (req, res) => res.json({ message: 'x' }));
app.use('/x', router);