Koa2

226 阅读2分钟

环境配置

脚手架

https://www.npmjs.com/package/koa-generator

npm start 入口文件

    "start": "node bin/www",

当执行到require('koa')语句时 node会递归查找node_modules目录里面的koa包 直到根目录为止!

找到koa包后会执行当前包里面package.json指定的入口文件

饶了一大圈最终执行/node_modules/koa/lib/application.js里面的application.js文件

当执行new Koa();时会初始化一个middleware 空数组

执行app.listen(3000); 会调用这个函数

看到**http.createServer((req,res) => {});**熟悉的代码,熟悉的味道有没有😂

然后我们看一下this.callback()是什么鬼?

this.callback()返回一个handleRequest

handleRequest返回 fnMiddleware(ctx).then(handleResponse).catch(onerror)

然后发现handleRequest在是callback()里面传的参;
我们直接看 callback()实现

  callback() {
    **const fn = compose(this.middleware);**

    if (!this.listenerCount('error')) this.on('error', this.onerror);

    const handleRequest = (req, res) => {
      **const ctx = this.createContext(req, res);**
      return this.handleRequest(ctx, fn);
    };

    return handleRequest;
  }

看callback()实现,发现 handleRequest(ctx, fn)函数传的参数是

** const ctx = this.createContext(req, res);**
** const fn = compose(this.middleware);**

this.middleware 在new Koa()被初始化为空数组 this.middleware = [];

this.createContext()函数

compose()函数 洋葱模型的核心实现 return Promise.resolve(fn(context, dispatch.bind(null, i + 1))); 这里面的fn()就是app.use()放进去的中间件函数

use()函数

我们可以看到在使用 app.use(); 的时候执行了 this.middleware.push(fn)语句,也就是说app.use()的时候把中间件函数放到了this.middleware = []里面

用 Koa 架设一个 HTTP 服务。

const Koa = require('koa');  // 导入模块。
const app = new Koa();  // 创建http服务。

app.listen(3000);      // 监听3000端口。

Context 对象

表示一次对话的上下文(包括 HTTP 请求和 HTTP 回复)

每个请求都将创建一个 Context,并在中间件中作为接收器引用,或者 ctx 标识符,Koa Context 将 node 的 request 和 response 对象封装到单个对象中,为编写 Web 应用程序和 API 提供了许多有用的方法。

具体API 查看

/node_modules/koa/lib/context.js 

路由(router)

koa-router

中间件(middleware)

中间件是处理http请求各种业务逻辑函数,Koa核心;(图中编号4)

处在 HTTP Request 和 HTTP Response 中间,用来实现某种中间功能的函数就叫做"中间件"

使用app.use()来加载中间件。

基本上,Koa 所有的功能都是通过中间件实现的,每个中间件默认接受两个参数,第一个参数是 Context 对象,第二个参数是next函数。只要调用next函数,就可以把执行权转交给下一个中间件。

koa配置package.json

{
  "name": "koa2-blog",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "start": "node bin/www",
    "dev": "./node_modules/.bin/nodemon bin/www",
    "prd": "pm2 start bin/www",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "bcryptjs": "^2.4.3",
    "debug": "^4.1.1",
    "koa": "^2.7.0",
    "koa-bodyparser": "^4.2.1",
    "koa-convert": "^1.2.0",
    "koa-json": "^2.0.2",
    "koa-logger": "^3.2.0",
    "koa-onerror": "^4.1.0",
    "koa-router": "^7.4.0",
    "koa-static": "^5.0.0",
    "koa-views": "^6.2.0",
    "koa2-cors": "^2.0.6",
    "nunjucks": "~3.0.0 "
  },
  "devDependencies": {
    "nodemon": "^1.19.1"
  }
}

学习资料

koajs官网
koa
koa2-note
koatc
koa
koa教程
koa教程