Koa的中间件

查看更多资源

1. Koa的中间件:

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

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

2. Koa中间件的功能及类型:

(1)功能包括

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

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

(2)类型

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

3. Koa中几种中间件的使用:

(1)应用级中间件

var Koa = require('koa');
var router = require('koa-router')();
var app = new Koa();

app.use(async (ctx, next) => { // 应用级中间件 

  console.log(new Date()); // 匹配任意路由之前打印日期

  await next(); // 当前路由匹配完成以后继续向下匹配,如果不写next,这个路由被匹配到了就不会继续向下匹配
})

router.get('/', async (ctx) => {
  ctx.body = "首页";
})

router.get('/news', async (ctx) => {
  ctx.body = "新闻列表页面";
})

router.get('/login', async (ctx) => {
  ctx.body = "新闻列表页面";
})

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

(2)路由级中间件

var Koa = require('koa');
var router = require('koa-router')();
var app = new Koa();

router.get('/', async (ctx) => { // 路由级中间件
  ctx.body = "首页";
  // 不写next,这个路由被匹配到了就不会继续向下匹配
})

router.get('/news', async (ctx, next) => { // 路由级中间件
  console.log('这是一个新闻1');
  await next(); // 匹配到news路由以后继续向下匹配路由
})

router.get('/news', async (ctx) => { // 路由级中间件
  ctx.body = '这是一个新闻';
  // 不写next,这个路由被匹配到了就不会继续向下匹配
})

router.get('/login', async (ctx) => { // 路由级中间件
  ctx.body = "新闻列表页面";
  // 不写next,这个路由被匹配到了就不会继续向下匹配
})

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

(3)错误处理中间件

var Koa = require('koa');
var router = require('koa-router')();
var app = new Koa();

app.use(async (ctx, next) => { // 错误处理中间件,匹配任何路由 
  console.log('这是一个中间件01');
  next(); // 继续向下匹配

  if (ctx.status == 404) {   // 错误处理 如果页面找不到...
    ctx.status = 404;
    ctx.body = "这是一个 404 页面"
  } else {
    console.log(ctx.url);
  }
})

router.get('/', async (ctx) => {
  ctx.body = "首页";
})

router.get('/news', async (ctx) => {
  console.log('这是新闻2');
  ctx.body = '这是一个新闻';
})

router.get('/login', async (ctx) => {
  ctx.body = "新闻列表页面";
})

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

(4)第三方中间件

const static = require('koa-static'); // 引入 第三方 模块
const staticPath = './static';

app.use(static( // 第三方中间件
path.join( __dirname, staticPath)
))

const bodyParser = require('koa-bodyparser');  // 引入 第三方 模块
app.use(bodyParser()); // 第三方中间件

4. Koa中间件的执行顺序:

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

var Koa = require('koa');
var router = require('koa-router')();  /*引入是实例化路由** 推荐*/
var app = new Koa();

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(3003);

/*
浏览器 访问 http://localhost:3003/news 将会 依次打印出:
1、这是第一个中间件01
2、这是第二个中间件02
3、匹配到了news这个路由
4、匹配路由完成以后又会返回来执行中间件
5、匹配路由完成以后又会返回来执行中间件
*/

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值