简介

Express是一个自身功能极简单,完全由路由和中间件构成的web开发框架,从本质上说,一个Express应用是在调用各种中间件。中间件(middleware)是一个函数,他可以访问请求对象(request object(req)),响应对象(response object(res))和web应用中处于请求-响应循环

Express中有如下几种中间件

  • 应用级中间件
  • 路由级中间件
  • 错误处理中间件
  • 内置中间件
  • 第三方中间件

应用级中间件

应用级中间键绑定到app对象使用app.useapp.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())