UsingMiddlewareExpress是一个路由和中间件web框架,它本身非常小:一个Express应用程序本质上是一系列中间件函数调用。中间件函数是可以访问请求对象(req)、响应对象(res)和应用程序请求-响应循环中的下一个中间件函数的函数,通常由一个名为next的变量表示。中间件函数可以执行以下任务:执行任何代码。更改请求和响应对象。结束请求-响应循环。调用堆栈中的下一个中间件函数。如果当前中间件函数没有结束请求-响应循环,则必须调用next()将控制权交给下一个中间件函数,否则请求将被挂起。Express应用程序可以使用以下类型的中间件:应用程序级中间件路由器级中间件错误处理中间件内置中间件第三方中间件您可以使用可选的挂载路径加载应用程序级和路由器级中间件,您可以使用它也可以加载一系列中间件功能,在加载点创建中间件系统的子堆栈。应用级中间件使用app.use()和app.METHOD()函数将应用级中间件绑定到app对象的实例,其中METHOD是中间件函数处理的请求的小写HTTP方法(例如GET、放置或发布)。这个例子展示了一个没有挂载路径的中间件函数,它在应用程序每次收到请求时执行。varapp=express()app.use(function(req,res,next){console.log('Time:',Date.now())next()})此示例显示安装在/user/:id为/user/:id路径上的任何类型的HTTP请求执行的路径上的中间件函数。app.use('/user/:id',function(req,res,next){console.log('RequestType:',req.method)next()})此示例显示路由及其处理函数(中间件系统)处理对/user/:id路径的GET请求。app.get('/user/:id',function(req,res,next){res.send('USER')})下面是使用挂载路径加载一系列中间件函数的例子mountpoint,它说明了一个中间件子堆栈,它将任何类型的HTTP请求的请求信息打印到/user/:id路径。app.use('/user/:id',function(req,res,next){console.log('RequestURL:',req.originalUrl)next()},function(req,res,next){控制台.log('RequestType:',req.method)next()})路由处理程序允许您为路径定义多个路由。以下示例为/user/:id路径定义了两个GET请求路由。第二条路由不会造成任何问题,但它永远不会被调用,因为第一条路由结束了请求-响应循环。此示例显示处理对/user/:id路径的GET请求的中间件子堆栈。app.get('/user/:id',function(req,res,next){console.log('ID:',req.params.id)next()},function(req,res,next){res.send('UserInfo')})///user/:id路径的处理程序,打印用户IDapp.get('/user/:id',function(req,res,next){res.end(req.params.id)})从路由器中间件栈中跳过剩余的中间件函数,调用next('route')将控制权交给下一个路由,注意:next('route')onlyAppliestomiddlewarefunctions使用app.METHOD()或router.METHOD()函数加载。此示例显示处理对/user/:id路径的GET请求的中间件子堆栈。app.get('/user/:id',function(req,res,next){//如果用户ID为0,跳到下一条路由if(req.params.id==='0')next('route')//否则将控制传递给此堆栈中的下一个中间件函数elsenext()},function(req,res,next){//发送常规响应res.send('regular')})///user/:id路径的处理程序,它发送一个特殊的响应app.get('/user/:id',function(req,res,next){res.send('special')})router-levelintermediateRouter级中间件的工作方式与应用程序级中间件相同,只是它绑定到express.Router()的实例。varrouter=express.Router()使用router.use()和router.METHOD()函数加载路由器级中间件。以下示例代码通过使用路由器级中间件为应用程序级中间件复制了上面显示的中间件系统:varapp=express()varrouter=express.Router()//一个没有安装路径的中间件函数。对路由器的每个请求都会执行此代码router.use(function(req,res,next){console.log('Time:',Date.now())next()})//中间件子堆栈显示向/user/:idpathrouter.use('/user/:id',function(req,res,next){console.log('RequestURL:',req.originalUrl)请求任何类型的HTTP请求的信息next()},function(req,res,next){console.log('RequestType:',req.method)next()})//处理对/user/的GET请求的中间件子堆栈:id路径路由器。get('/user/:id',function(req,res,next){//如果用户ID为0,则跳到下一个路由器if(req.params.id==='0')next('route')//否则将控制传递给堆栈中的下一个中间件函数elsenext()},function(req,res,next){//渲染一个常规页面res.render('regular')})//handler对于/user/:idpath,渲染一个特殊的pagerouter.get('/user/:id',function(req,res,next){console.log(req.params.id)res.render('special')})//mount应用程序上的路由器app.use('/',router)要跳过其余的路由器中间件功能,请调用next('router')将控制权从路由器实例中返回此示例显示了一个中间件子堆栈,它处理对/admin路径的GET请求。varapp=express()varrouter=express.Router()//判断路由器是否需要检查和退出router.use(function(req,res,next){if(!req.headers['x-auth'])returnnext('router')next()})router.get('/',function(req,res){res.send('hello,user!')})//使用路由器和401anythingfallthroughapp.use('/admin',router,function(req,res){res.sendStatus(401)})errorhandlingmiddlewareerrorhandlingmiddleware总是需要四个参数,你必须提供四个参数来识别它是一个错误handling中间件函数,即使不需要使用next对象,也必须指定它来维护签名,否则next对象会被解释为常规中间件,无法处理错误。以与其他中间件函数相同的方式定义错误处理中间件函数,除了使用四个参数而不是三个参数,特别是签名(err,req,res,next):app.use(function(err,req,res,next){console.error(err.stack)res.status(500).send('Somethingbroke!')})有关错误处理中间件的更多信息,请参阅:错误处理。内置中间件从4.x版本开始,Express不再依赖Connect。之前包含在Express中的中间件功能现在位于不同的模块中。请参阅中间件功能列表。Express具有以下内置中间件功能:express.static提供静态资源,例如HTML文件、图像等。express.json使用JSON有效负载解析传入请求,注意:适用于Express4.16.0+。express.urlencoded解析带有URL编码负载的传入请求,注意:适用于Express4.16.0+。第三方中间件使用第三方中间件向Express应用程序添加功能。安装Node.js模块以获得您需要的功能,然后在应用程序级别或路由器级别将其加载到您的应用程序中。下面的例子说明了cookie解析中间件函数cookie-parser的安装和加载。$npminstallcookie-parservarexpress=require('express')varapp=express()varcookieParser=require('cookie-parser')//加载cookie解析中间件app.use(cookieParser())通常用于Express有关第三方中间件功能的部分列表,请参阅:第三方中间件。上一篇:编写中间件下一篇:使用模板引擎
