koa2 中间件


Koajs入门视频教程在线学习地址https://www.bilibili.com/video/BV1xm4y1c7zr/?p=1

Koajs入门视频教程网盘下载地址https://pan.baidu.com/s/1QN_XkXRXmIw6V7HevntBQQ 提取码:abcd


一、什么是Koa的中间件

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

Koa的中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res))。在 Koa中处理请求、响应循环流程的变量一般被命名为 next 变量。

如果我们的get、post回调函数中,没有next参数,那么匹配到这个路由就不会继续往下匹配了。如果想往下匹配的话,那么需要写next()


二、Koa应用可使用如下几种中间件:
应用级中间件
路由级中间件
错误处理中间件
第三方中间件

1.应用级中间件

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

const app = new Koa();
const router = new Router();
app.use(async (ctx,next)=>{
	console.log(new Date());
	await next();
})
router.get('/', function (ctx, next) {
	ctx.body="Hello koa";
})
router.get('/news',(ctx,next)=>{
	ctx.body="新闻页面"
});
app.use(router.routes()); //作用:启动路由
app.use(router.allowedMethods()); //作用: 当请求出错时的处理逻辑
app.listen(3000,()=>{
	console.log('starting at port 3000');
});

2、路由中间件

router.get('/', async(ctx, next)=>{
	console.log(1)
	next()
})
router.get('/', function (ctx) {
	ctx.body="Hello koa";
})

3、错误处理中间件

app.use(async (ctx,next)=> {
	next();
	if(ctx.status==404){
	ctx.status = 404;
	ctx.body="这是一个404页面"
}
});
4、第三方中间件
const static = require('koa-static'); 
	const staticPath = './static'; 
	app.use(static(
	path.join( __dirname, staticPath)
)) 

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

三、Koa中间件的执行顺序


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


const Koa = require('koa');
const Router = require('@koa/router');
var app = new Koa();
var router = new Router();
app.use(async (ctx,next)=>{
  console.log('1、这是第一个中间件01');
  await next();
  console.log('5、匹配路由完成以后又会返回来执行中间件');
})
app.use(async (ctx,next)=>{
  console.log('2、这是第二个中间件02');
  await next();
  console.log('4、匹配路由完成以后又会返回来执行中间件');
})
router.get('/',async (ctx)=>{
  ctx.body="首页";
})
router.get('/news',async (ctx)=>{
  console.log('3、匹配到了news这个路由');
  ctx.body='这是一个新闻';
})
app.use(router.routes()); //作用:启动路由
app.use(router.allowedMethods()); //作用: 当请求出错时的处理逻辑
app.listen(3000, () => {
  console.log('starting at port 3000');
});