简介
Express是一个自身功能极简单,完全由路由和中间件构成的web开发框架,从本质上说,一个Express应用是在调用各种中间件。中间件(middleware)是一个函数,他可以访问请求对象(request object(req)),响应对象(response object(res))和web应用中处于请求-响应循环
Express中有如下几种中间件
- 应用级中间件
- 路由级中间件
- 错误处理中间件
- 内置中间件
- 第三方中间件
应用级中间件
应用级中间键绑定到app对象使用app.use
和app.METHOD()
-需要处理http请求的方法,例如GET、PUT、POST
var app = express() // 没有挂载路径的中间件,应用中的每个请求都会执行该中间件 app.use((req,res,next) => { console.log('Time',Dtae.now()); next(); // 传递request对象给下一个中间件 }) // 挂载至/user/:id的中间件,任何执行/user/:id的请求都会执行它 app.use('/use/:id',(req,res,next) => { console.log('Request Type',req.method); next(); }) // 路由和句柄函数(中间件系统),处理指向/user/:id的GET请求 app.get('/user/:id',(req,res,next)=>{ console.log('USER'); }
next()
把执行权交给下一个中间件,中间件必须有next()
或者res.end()
,不然此请求会被永远挂起
路由级中间件
var app = express() var router = express.Router() // 没有挂载路径的中间件,通过该路由的每个请求都会执行该中间件 router.use(function (req, res, next) { console.log('Time:', Date.now()); next(); }) // 一个中间件,显示任何指向/user/:id的HTTP请求的信息 router.use('/user/:id',(req,res,next)=>{ console.log('Request URL',req.originalUrl) next() },(req,res,next)=>{ console.log('Request Type',req.method) next() }) // 一个中间件栈,处理指向/user/:id的GET请求 router.get('/user/:id',(req,res,next)=>{ if(req.params.id == 0) next('router') else next() },(req,res,next)=>{ res.render('regular') }) // 将路由挂载至应用 app.use('/',router)
错误处理中间件
错误处理中间件有四个参数,定义错误处理中间件必须使用这四个参数。即使不需要next对象,也必须在参数中声明它,否者中间件会识别为一个常规中间件,不能处理错误
app.use((err,req,res,next)=>{ console.error(err.stack) res.status(500).send('Something broke') })
内置中间件
express.static是 Express 唯一内置的中间件。
var options = { dotfiles: 'ignore', etag: false, extensions: ['htm', 'html'], index: false, maxAge: '1d', redirect: false, setHeaders: function (res, path, stat) { res.set('x-timestamp', Date.now()); } } app.use(express.static('public', options));
第三方中间件
通过使用第三方中间件从而为Express应用增加更多的功能
// $ npm install cookie-parser var express = require('express') var app = express() var cookieParser = require('cookie-parser') // 加载用于解析cookie的中间件 app.use(cookieParser())