路由级别中间件是怎么会事儿?

  路由级别中间件是在Express框架中定义路由的中间件函数。它们通过检查HTTP请求的路径和方法来确定是否应该调用它们。如果请求的路径与路由级别中间件的路径匹配,那么它就会被调用。
 
  路由级别中间件是通过express.Router()方法创建的路由器实例中使用的。这些中间件函数在这个路由器中定义,而不是在应用程序实例中定义。
 
  下面是一个示例,说明如何在Express应用程序中使用路由级别中间件:
 
  constexpress=require('express');
 
  constapp=express();
 
  constrouter=express.Router();
 
  //路由级别中间件
 
  router.use((req,res,next)=>{
 
  console.log('Time:',Date.now());
 
  next();
 
  });
 
  //路由定义
 
  router.get('/',(req,res)=>{
 
  res.send('HelloWorld!');
 
  });
 
  //将路由器挂载到应用程序实例中
 
  app.use('/',router);
 
  app.listen(3000,()=>{
 
  console.log('Exampleapplisteningonport3000!');
 
  });
 
  在上面的示例中,router.use()方法定义了一个路由级别中间件。这个中间件函数打印当前时间,然后调用next()函数,将控制权传递给下一个中间件或路由处理程序。
 
  然后,router.get()方法定义了一个路由处理程序,用于处理HTTPGET请求,当请求的路径为/时返回"HelloWorld!"。
 
  最后,app.use()方法将路由器挂载到应用程序实例中,使其成为应用程序的一部分。这样,当应用程序收到任何请求时,它都会首先调用路由级别中间件,然后根据请求的路径调用相应的路由处理程序。
 
  当路由器中存在多个路由级别中间件时,它们将按照定义的顺序依次执行。如果其中一个中间件函数调用了next()函数,它将传递控制权给下一个中间件函数或路由处理程序。如果没有任何中间件函数调用next()函数,请求将在路由器中止,不会进一步处理。
 
  在路由级别中间件中,还可以使用参数来指定路径和方法。例如,下面的代码演示了如何为特定路径和方法定义一个路由级别中间件:
 
  constexpress=require('express');
 
  constapp=express();
 
  constrouter=express.Router();
 
  //仅对/users路径下的POST请求进行身份验证
 
  router.post('/users',authenticate,(req,res)=>{
 
  res.send('Authenticated!');
 
  });
 
  //路由级别中间件
 
  functionauthenticate(req,res,next){
 
  //实现身份验证逻辑
 
  //如果身份验证通过,调用next()函数
 
  //否则,发送身份验证失败的响应
 
  }
 
  app.use('/',router);
 
  app.listen(3000,()=>{
 
  console.log('Exampleapplisteningonport3000!');
 
  });
 
  在上面的示例中,router.post()方法定义了一个仅对/users路径下的POST请求进行身份验证的路由处理程序。身份验证逻辑由authenticate函数实现,它在请求通过身份验证后调用next()函数。
 
  需要注意的是,路由级别中间件中不能使用res.send()或res.render()等响应方法。如果尝试在这些方法中发送响应,将会抛出错误。这是因为在这些方法调用之前,请求仍在路由器中传递,还需要通过其他中间件或路由处理程序进行处理。
 
  总之,路由级别中间件是在Express应用程序中定义路由的一种方便的方式,可以让开发人员在应用程序中添加更复杂的路由处理逻辑。它们可以在路由器级别上定义,并根据需要包含特定路径和方法的处理逻辑。