美文网首页koa
koa系列(三)

koa系列(三)

作者: 笑红尘123 | 来源:发表于2019-12-16 16:21 被阅读0次

文章内容:koa 中间件 以及 koa 中间件的执行流程。

一、什么是 Koa 的中间件

中间件就是匹配路由之前或者匹配路由完成做的一系列的操作,我们就可以把它叫做中间件。
在express中间件(Middleware)是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 web 应用中处理请求-响应循环流程中的中间件,一般被命名为 next 的变量。在 Koa 中中间件和 express 有点类似。
中间件的功能包括:

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

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

//引入 koa模块
var Koa = require('koa');
var Router = require('koa-router');

//实例化
var app = new Koa();
var router = new Router();

//匹配任何路由,如果不写next,这个路由被匹配到了就不会继续向下匹配
app.use(async (ctx, next) => {
    console.log("我是一个中间件");
    // 当前路由匹配完成以后继续向下匹配
    await next();
});
//配置路由
router.get('/', async (ctx) => {
    ctx.body = "首页";
});
router.get('/news', async (ctx) => {
    ctx.body = "列表页";
});
//启动路由
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);

我们在匹配路由之前写了一个 app.use(async ()=>{}) 的中间件,该中间件如果不像 router.get 那样写一个参数 "/" 或 "/news",那么它将匹配任何一个路由,且最先匹配,如果我们在其中写 next() 的话,则会终止在此,不再向下陪陪路由,运行结果如下:


image

路由中间件:

//引入 koa模块
var koa = require('koa');
var router = require('koa-router')()
//实例化
var app = new Koa();
//配置路由
router.get('/', async (ctx, next) => {
    console.log("控制台打印");
    // 当前路由匹配完成以后继续向下匹配
    await next();
});
router.get('/', async (ctx) => {
    ctx.body = "首页";
});
router.get('/list', async (ctx) => {
    ctx.body = "列表页";
});
//启动路由
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);

在上面的代码中我们定义了两个 router.get('/', ) 的路由,第一个我们在控制台输出一句话,第二个我们想页面输出内容。如果在第一个里面我们不写 next() 方法的话,则不会进入第二个里面,结果如下:


image

错误处理中间件:

//引入 koa模块
var koa = require('koa');
var router = require('koa-router')();
//实例化
var app = new koa();
//匹配任何路由,如果不写next,这个路由被匹配到了就不会继续向下匹配
app.use(async (ctx,next)=>{
    await next();
    //如果页面找不到
    if(ctx.status==404){
        ctx.status = 404;
        ctx.body="404 页面"
    }
});
//配置路由
router.get('/', async (ctx) => {
    ctx.body = "首页";
});
router.get('/list', async (ctx) => {
    ctx.body = "列表页";
});

//启动路由
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);

我们还按之前的应用中间件那样写,然后在里面做了一个 if 语句判断,当页面响应时,会给后端返回一个 status 码,这个就不在单独说了,如果这个 status 报 404,我们知道表示该页面不存在,那么我们就可以拦截 next() 方法,输出给前端一个 404 页面

//引入 koa模块
var Koa = require('koa');
var 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) => {
    console.log('3、匹配到了news这个路由');
    ctx.body = "首页";
});
//启动路由
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);

我们在上面的代码引用了两个应用级的中间件,分别在 next() 前后输出日志,当我们访问 localhost:3000/ 时,我们看一下控制台的输出结果:


image

从输出打印结果顺序我们可以看出中间件会先逐级处理 request 请求,然后再返回来逐级处理 response 请求,这就是我们为什么要将 错误处理中间件 中的 if 判断语句放在 next() 方法之后,这样就是在路由进入 "/news" 后返回 status = 404 的结果后再进行处理,如果放在了 next() 方法之前,则会直接判断 if 语句,不会再向下匹配 "/news" 路由了。比如我们的用户登录系统就可以这么用,当用户输入账号密码后出入后台,后台在数据库匹配之后再进行处理,处理之后返回给前端
如果感觉有帮助留下一个宝贵的赞或者给小编一个赞赏!!
同时如果想了解更多内容可以关注下方公众号:


qrcode_for_gh_4effe528d112_258.jpg

相关文章

  • koa2入门系列

    koa2入门系列(一) koa2入门系列(二) koa2入门系列(三) koa2入门系列(四) koa2入门系列(...

  • koa系列(三)

    文章内容:koa 中间件 以及 koa 中间件的执行流程。 一、什么是 Koa 的中间件 中间件就是匹配路由之前或...

  • Koa2教程(初识篇)

    目录一、定义二、安装三、koa中间件 系列教程Koa2教程(入门篇)Koa2教程(常用中间件篇) 一、定义 一个简...

  • Node.js Koa框架之Response/Request 委

    目录 Koa框架 Response 、Request 委托 1. Koa框架 —— Koa 是包含一系列中间件...

  • Koa系列课程马上发布

    Koa系列课程马上发布,敬请关注。。。

  • Koa2教程(常用中间件篇)

    目录一、koa-bodyparser二、koa-router三、koa-views + ejs四、koa-stat...

  • Koa和Nunjucks的API使用总结

    一、Koa的使用: 二、Koa-router处理不同URL 三、Nunjucks的使用 四、Koa-router框...

  • koa-static

    koa-static是一个koa-send的封装,所以重点其实是koa-send.koa-send会接收三个参数,...

  • 《Koa诞生记》——如何写好README

    回顾前三章内容,讨论了koa的核心模块 koa-compose的实现,自己实现一个简单的koa,以及koa实现 s...

  • NodeJs框架 Koa

    目录 一、简介 二、 Koa之hello world 三、服务器自动重新部署 四、Koa中间件 五、Koa路由配置...

网友评论

    本文标题:koa系列(三)

    本文链接:https://www.haomeiwen.com/subject/tfkdnctx.html