环境配置
脚手架
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"
}
}