1. Koa 中间件简介

通俗的讲:中间件就是 匹配路由之前 或者 匹配路由完成后 做的一系列的操作,我们就可以把它叫做中间件。

在 express, 中间件(Middleware)是一个函数,它可以访问请求对象(request), 响应对象(response), 和 web 应用中处理请求-响应循环流程中的中间件,一般被命名为 next 的变量。在 Koa 中中间件和 express 有点类似。

中间件的功能包括:

  • 执行任何代码;
  • 修改请求和响应对象;
  • 终结请求-响应循环;
  • 调用堆栈中的下一个中间件;

如果 get、post 回调函数中,没有 next 参数,那么就匹配上第一个路由,就不会往下匹配了,
如果想往下匹配的话,那么需要写 next();

2. Koa 应用可使用如下几种中间件

2.1 应用级中间件

const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router();

/*
中间件
*/
// 匹配任何路由 如果不写 next,这个路由被匹配到了就不会继续向下匹配 
app.use(async (ctx, next) => {
  ctx.body="中间件";
  console.log(new Date());
  await next();
})

router.get('/newsContent',async (ctx) => {
  ctx.body="新闻详情"
})

app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000,()=>{ 
  console.log('应用已经启动,http://localhost:3000'); 
});

2.2 路由中间件

const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router();

/*
中间件
*/
// 匹配到 news 路由之后继续向下匹配 
router.get('/news',async (ctx, next) => {
  console.log("新闻详情");  
  await next(); 
})

router.get('/news',async (ctx) => {
  ctx.body="新闻详情"
})

app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000,()=>{ 
  console.log('应用已经启动,http://localhost:3000'); 
});

2.3 错误处理中间件

const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
const router = new Router();

/*
中间件
*/
app.use(async (ctx,next) => {
  console.log('中间件');
  await next();

  if(ctx.status == 404){
    ctx.status = 404;
    ctx.body = '404页面';
  }else{
    console.log(ctx.url)
  }
})

router.get('/news',async (ctx, next) => {
  ctx.body="新闻详情"
  console.log('新闻详情')
})

app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000,()=>{ 
  console.log('应用已经启动,http://localhost:3000'); 
});

2.4 第三方中间件

const static = require('koa-static'); 
const staticPath = './static'; 
app.use(static( 
	path.join( __dirname, staticPath) 
))

const bodyParser = require('koa-bodyparser');
app.use(bodyParser());

3. Koa 中间件的执行顺序

Koa 的中间件和 Express 不同,Koa 选择了洋葱圈模型。
Koa 中间件_node.js