haizlin / fe-interview

前端面试每日 3+1,以面试题来驱动学习,提倡每日学习与思考,每天进步一点!每天早上5点纯手工发布面试题(死磕自己,愉悦大家),6000+道前端面试题全面覆盖,HTML/CSS/JavaScript/Vue/React/Nodejs/TypeScript/ECMAScritpt/Webpack/Jquery/小程序/软技能……
http://www.h-camel.com
MIT License
25.55k stars 3.26k forks source link

[NodeJs] 请说说koa的app.use()执行流程 #2133

Open haizhilin2013 opened 4 years ago

haizhilin2013 commented 4 years ago

请说说koa的app.use()执行流程

我也要出题

ruochuan12 commented 4 years ago

app.use(),简单说其实就是把函数存放到this.middleware数组里,然后返回实例对象this

koa2中详细点,则是判断是generator函数,用koa-convert(其实用的是co)转换一次,再存放到this.middleware数组里。

use(fn) {
    if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
    if (isGeneratorFunction(fn)) {
      deprecate('Support for generators will be removed in v3. ' +
                'See the documentation for examples of how to convert old middleware ' +
                'https://github.com/koajs/koa/blob/master/docs/migration.md');
      fn = convert(fn);
    }
    debug('use %s', fn._name || fn.name || '-');
    this.middleware.push(fn);
    return this;
  }

真正执行是app.listen

具体源码可以看我这篇文章。 若川:学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理

zsasjy commented 3 years ago

洋葱模型,会先执行第一个中间件,遇到await next执行下一个中间件,等待下一个中间件执行完毕后,再执行await next后的代码