Express中间件

2019-04-19

Express中间件

再怎么强调中间件在Express程序框架中的地位都不过分,可以说Express几乎就是由中间件搭建起来的服务应用。

官方文档中的Express中间件描述为:

Middleware functions are functions that have access to the request object (req), the response object (res), and the nextfunction in the application’s request-response cycle. The next function is a function in the Express router which, when invoked, executes the middleware succeeding the current middleware.

渣翻:

中间件是能够获取到Express应用请求-响应生命周期中reqres对象,以及next函数的函数。next函数在Express路由中的作用是,当它被调用时,将请求处理从当前中间件移交给下一个中间件。

一个典型的Express应用中中间件位置如下:

var express = require('express');
var app = express();

//中间件1
app.get('/',function(req,res,next){
  console.log('middleware1');
  next();
})
//中间件2
app.get('/',function(req,res,next){
  console.log('middleware2');
  res.send('hello world.')
})
//中间件3
app.get('/',function(req,res,next){
  console.log('middleware3');
  res.send('This should not work.')
})


app.listen(3000);
  • 定义中间件的方式是使用app.VERB()定义路由相关的中间件(又称路由处理器),VERB指HTTP谓词或者all(),即处理所有的类型的HTTP请求;或者使用app.use()定义不需要路由的全局中间件,比如静态文件服务,日志服务等等。
  • 中间件通过路由的方式连接起来,通过调用next()进行传递。如果一个中间件里不调用next(),意思就是请求处理中止,语义上应该返回一些东西(比如返回一个JSON,一个HTML或者什么的)
  • 中间件是在类似shell中“管道”里依次进行的,中间件的定义顺序有意义。比如,一般会在最后放一个“捕获一切”的终结中间件(即不调用next()的中间件),一般是返回404状态码的中间件。而如果将返回404的中间件放在最前面,则会造成服务全部返回404。

常用中间件

中间件除了让Express程序逻辑更加清晰,也提供了“开箱即用”的模块化功能。想要一个功能,如果有,就找出一个中间件,插入到中间件管道里,完事~

Express内置的中间件:

  • express.static(root, [options]):静态文件服务中间件
  • express.json([options]):JSON解析中间件
  • express.urlencoded([options]):url编码中间件