zoukankan      html  css  js  c++  java
  • koa2 中间件里面的next到底是什么

    https://www.cnblogs.com/cloud-/p/7239819.html

    const Koa = require('koa');
    const app = new Koa();
    app.use(async (ctx, next) => {
      const start = Date.now();
      await next();
      const ms = Date.now() - start;
      console.log(`${ctx.method} ${ctx.url} - ${ms}`);
    });
    app.listen(3000);

    我们顺藤摸瓜,打开 koa里面的application.js (或者直接debug进入),

    1.首先看 use ,就是push一个函数到 this.middleware

    2. 再看listen, 方法里面 http.createServer(this.callBack), this.callBack返回的是 function(req,res){......}的函数,连起来就是 http.createServer(function(req,res){....}),标准的http创建服务的方法

    3.  最后看callback,里面的核心方法, compose(this.middleware) 返回一个promise,处理完毕后再执行 handleResponse

    这三个连起来,就是每次请求的时候,先进入callback, compose中间件,执行完毕后,接着处理请求。那剩下的重点变为 compose 

     与上面的参数对应关系如下

    context :ctx,

    next : function next(){ return dispatch(i+1)}

    所以 await next() 就等于 await function next(){ return dispatch(i+1)} , 而 dispatch(i+1)就进入了下一个中间件了。

    核心就是 dispatch(i+1),也就是dispatch(1) , dispatch本身返回promise, 所以你就在这里 await 。

    依此类推 disptach(1) 会执行 this.middleware[1],  那个时候 fn就为 logger执行的函数,就这么推下去。

    关于结束,还是 next 不存在的时候。 结果完毕后,再依次往上走。

    所以执行的顺序是越先注册越后执行, 当然还得看你 await next() 放在什么位置。 因为这里我的 console.log都放在了 await的后面,都放到前面,结果如何,亲自测试一下喽。 

  • 相关阅读:
    DOM
    JS方法
    边界与边框,列表与方块
    for 练习
    背景与前景温习
    AD域账号验证
    邮件发送案例
    获取每个月最后一天的小技巧
    SQL 执行顺序
    常用下载地址
  • 原文地址:https://www.cnblogs.com/dhjy123/p/13410183.html
Copyright © 2011-2022 走看看