这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战
这篇文章是 nodejs 应用学习的第一篇文章,koa 基本应用
根据 koa 官网和自己写的 demo 总结出来的学习心得,希望评论和点赞~
koa 框架是什么
koa 是有 Express 团队开发的 web 框架,官网 koajs.com/
koa 的安装方式
下面我们新建一个项目,边练习边试用 koa 框架
mkdir koa_demo
cd koa_demo
npm init
一路回车...
touch index.js
至此,我们新建了一个空项目,并通过 npm 初始化了一下
为了使我们开发更方便,安装下 nodemon,npm i nodemon,修改下 package.json 的内容。这样可以在我们修改文件后实时更新。
"scripts": {
"dev": "nodemon --inspect index.js"
},
下面安装 koa 框架,执行 npm i koa。至此初始化项目和安装 koa 完成了~
koa 开始使用
编辑 index.js 文件
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'hello koa';
})
app.listen(3000)
在终端执行 npm run dev,访问 http://localhost:3000/ 可以看到~
一个简单的 koa 服务就启动完成了~
koa 中间件编写
koa 是包含着一系列的中间件函数的对象,这些中间件函数根据请求,以类似堆栈的方式组合和执行。
下面我们来写几个简单的中间件,并看一下他们的执行顺序
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next) => {
console.log(1);
await next();
console.log(5);
})
app.use(async (ctx, next) => {
console.log(2);
await next();
console.log(4);
})
app.use(async ctx => {
console.log(3);
ctx.body = 'hello koa';
})
app.listen(3000);
// 1 2 3 4 5
可以看到,实际各个中间件的输出结果是 1 2 3 4 5
use 方法参数接收的函数是中间件,函数有两个参数,第一个参数是 ctx,koa 的上下文,会在下面讲到;第二个参数是 next 方法。
中间件依次执行,当一个中间件执行时,遇到 next() 方法后,会将控制权转移到下一个中间件,待最后一个中间件执行完成后,会向上依次执行 next 后面的内容,这也叫做洋葱模型。具体的源码实现将会在下一章节讲到。
koa listen 实现
前面有看到 app.listen(3000) 来监听端口,koa 的 listen 函数实际的实现就是
const http = require('http');
const Koa = require('koa');
const app = new Koa();
http.createServer(app.callback()).listen(3000);
端口和应用程序实际是多对多的关系,即一个应用程序可以跑在多个端口上,一个端口也可以跑多个应用程序(聚合在一起的),如果像增加 https 的监听就可以这样写
const http = require('http');
const https = require('https');
const Koa = require('koa');
const app = new Koa();
http.createServer(app.callback()).listen(3000);
https.createServer(app.callback()).listen(3001);
koa 的 context
在上面中间件部分有看到,中间件函数的第一个参数是 ctx,也就是 koa 的上下文,它将 node 的 request 和 response 封装到了一起,并添加了很多有用的方法。
app.use(async ctx => {
ctx; // 这是 Context
ctx.request; // 这是 Koa Request
ctx.response; // 这是 Koa Response
});
具体的 API 建议直接参考官网的 context 部分:koajs.com/#context
另外,如果需要给 ctx 增加属性,可以通过 app.context,app.context 是创建 ctx 的原型,比如:
app.context.db = db();
app.use(async ctx => {
console.log(ctx.db);
});
这样在 ctx 上增加了 db 属性,但是如果需要修改 ctx 上的已有属性,因为 ctx 上大多数已有属性是通过 defineProperty 创建的,于是需要在 app.context 上通过 defindProperty 修改,不建议这么做的
至此,koa 的基本应用部分完成,下一章将分析 koa 中间件洋葱模型的实现方式
详细见 koa 官网:koajs.com/