# 关于use做了什么

# 函数使用部分

app.use(async (ctx,next) => {
    console.log(3);
    await next()
    console.log(4);
})
1
2
3
4
5

# 源码部分

  use(fn) {
    //如果传入进来的不是一个函数,报错
    if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
    //如果这个函数是用generator的,不是用async的函数,警告,并将该函数转换成async的样子
    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);
    }
    // 可以运行package.json里面的命令,运行一下,看看效果
    // "debug_windows": "set DEBUG=koa:application & node ./app.js",
    // "debug_linux": "DEBUG=koa:application node ./app.js"

    debug('use %s', fn._name || fn.name || '-'); 
    this.middleware.push(fn); //将中间件推入middleware这个数组里
    return this; //返回this,方便链式调用
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

可以看见,use里面最主要的部分就是在前置知识点二说过的那样,把传入来的函数, 放入到middleware中,方便后面对这个数组里面的子项进行递归调用.

熟悉koa的小伙伴应该知道,接下来,我们只需要listen(port)就可以启动整个项目了,那么,最后一步,让我们来看看listen做了什么