表达中间件的困惑

时间:2018-04-27 11:04:48

标签: javascript node.js express

我有一个这样的应用程序:

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中的其他路由?

2 个答案:

答案 0 :(得分:2)

即使您是通过路由器完成的,因为您随后连接了没有子路径的路由器,它将所有内容捆绑在一起。在您的示例中,您已将所有内容附加到同一父端点/,因此即使通过路由器完成,您也可以将此路由器连接到/feature1/x路径。

如果您只想将中间件分开,那么您有两种选择。

  1. 将端点转换为/feature2/y/feature1之类的路径。将中间件分别附加到/feature2/x。这将为您提供所需的结果。这可以通过以这种方式连接端点app.use('/feature1', router);的路由器来完成:

    /feature1/x
  2. 这意味着您现在拥有端点/yapp.get('/x, middleware('a'), (req, res) => res.json({message: 'x'}); app.get('/y', middleware('b'), (req, res) => res.json({message: 'y'}); 。每个触发它的独立中间件链。

    1. 将中间件附加到特定端点,例如:

      /
    2. 您目前所做的是将所有内容附加到相同的路径路径(在本例中为顶级斜杠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);