18. express 中的中间件

2019-04-28  本文已影响0人  璎珞纨澜

中间件

官网:http://expressjs.com/en/guide/using-middleware.html

中间件本质就是一个请求处理方法。该方法接收三个参数:

中间件执行步骤:

  1. 当请求进来,会从第一个中间件开始进行匹配,如果匹配,则进来,如果请求进入中间件之后,没有调用 next 则代码会停在当前中间件。
  2. 如果调用了 next 则继续向后找到第一个匹配的中间件,如果不匹配则继续判断下一个中间件是否匹配,直到找到匹配的中间件并执行。所以 next 是一个方法,用来调用下一个中间件的,调用 next 方法也是要匹配的(不是调用紧挨着的那个)。
  3. 如果没有能匹配的中间件,则 Express 会默认输出:Cannot GET 路径

我们把用户从请求到响应的整个过程分发到多个中间件中去处理,这样做的目的是提高代码的灵活性,动态可扩展性。

应用程序级别中间件

是万能匹配,不关心请求路径和请求方法,也就是任何请求都会进入这个中间件。

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

只要是以 /xxx/ 开头的:
app.use('/xxx', function (req, res, next) {
console.log('Time:', Date.now())
next()
})

路由级别中间件

express.Router() 就是路由级别中间件
以下是常用的路由级别中间件:
get:

app.get('/', function (req, res, next) {
  res.send('Hello World!')
  next()
})

post:

app.post('/', function (req, res, next) {
  res.send('Got a POST request')
})

put:

app.put('/user', function (req, res, next) {
  res.send('Got a PUT request at /user')
})

delete:

app.delete('/user', function (req, res, next) {
  res.send('Got a DELETE request at /user')
})
错误处理中间件

错误处理中间件方便用于进行统一错误处理。

错误处理中间件执行步骤:

  1. 当发生错误的时候,我们可以调用 next 传递错误对象
  2. 当调用 next 的时候,如果传递了参数,则直接往后找到带有四个参数的应用程序级别中间件,然后就会被全局错误处理中间件匹配到并处理之。
var express = require('express')
var fs = require('fs')

var app = express()

app.get('/', function (req, res, next) {
  fs.readFile('.d/sa./d.sa/.dsa', function (err, data) {
    if (err) {
      // return res.status(500).send('Server Error')
      next(err)
    }
  })
})

app.get('/a', function (req, res, next) {
  fs.readFile('./abc', function (err, data) {
    if (err) {
      // return res.status(500).send('Server Error') 
      next(err)
    }
  })
})

app.use(function (req, res, next) {
  res.send('404')
}) // => next(err) 不会进入这个方法

// 配置错误处理中间件,next(err) 将直接进入这个方法
app.use(function (err, req, res, next) {
  res.status(500).send(err.message)
})

app.listen(3000, function () {
  console.log('app is running at port 3000.')
})

内置中间件

具有某种特殊功能的中间件:

第三方中间件

网站:http://expressjs.com/en/resources/middleware.html

上一篇下一篇

猜你喜欢

热点阅读