一、Koa 框架介绍
Node.js 是一个异步的世界,官方 API 支持的都是 callback 形式的异步编程模型,这 会带来许多问题,例如:1、callback 嵌套问题 2、异步函数中可能同步调用 callback 返回 数据,带来不一致性。为了解决以上问题 Koa 出现了。
Koa
-- 基于 Node.js 平台的下一代 web 开发框架
koa
是由Express
原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 使用 koa 编写 web 应用,可以免除重复繁琐的回调函数嵌套, 并极大地提 升错误处理的效率。koa 不在内核方法中绑定任何中间件, 它仅仅提供了一个轻量优雅的 函数库,使得编写 Web 应用变得得心应手。开发思路和 express 差不多,最大的特点就是 可以避免异步嵌套。
Koa 学习网站:
- 英语官网:
- 中文官网:
二、Koa2.x 框架的安装使用
1、安装 Node.js 8.x 以上的版本
开发 Koa2 之前,Node.js 是有要求的,它要求 Node.js 版本高于 V7.6。因为 node.js 7.6 版本 开始完全支持 async/await,所以才能完全你支持我们的 Koa2。
2、安装 Koa:
安装 Koa 框架和我们以前安装其他模块是一样的。
# 初始化package.jsonnpm init# 安装koa2 npm install --save koa / cnpm install --save koa复制代码
简单使用:
/引入 Koaconst koa=require('koa'); const app=new koa();//配置中间件 (可以先当做路由) app.use( async (ctx)=>{ ctx.body='hello koa2'})//监听端口 app.listen(3000);console.log(' starting at port 3000')复制代码
编写完成后在命令行中输入:
node index.js复制代码
然后在浏览器中输入: 就可以看到结果了。
三、Koa异步处理Async 、Await和Promise 的使用(重点*)
async
是“异步”的简写,而await
可以认为是async wait
的简写。所以应该很好理解async
用于申明一个function
是异步的,而await
用于等待一个异步方法执行完成。
简单理解:
- async 是让方法变成异步。
- await 是等待异步方法执行完成。
详细说明:
async 是让方法变成异步,在终端里用 node 执行这段代码,你会发现输出了 Promise {‘Hello async’ },这时候会发现它返回的是 Promise。
async function testAsync(){ return 'Hello async';}const result = testAsync(); console.log(result);复制代码
PS E:\code\BXShop> node async.js Promise { 'Hello async' }复制代码
await 在等待 async 方法执行完毕,其实 await 等待的只是一个表达式,这个表达式在官方 文档里说的是 Promise
对象,但是它也可以接受普通值。 注意:await
必须在 async
方法中 才可以使用因为 await
访问本身就会造成程序停止堵塞,所以必须在异步方法中才可以使用。
function getData(){ return 'zhangsan';}async function testAsync(){ return 'Hello async';}复制代码
sync function test(){ const v1=await getData(); const v2=await testAsync(); console.log(v1,v2);} test();复制代码
async/await 同时使用
async 会将其后的函数(函数表达式或 Lambda)的返回值封装成一个 Promise 对象,而 await 会等待这个 Promise 完成,并将其 resolve 的结果返回出来。
function findData() { return new Promise(resolve => { setTimeout(() => resolve("long_time_value"),1000 ); });}async function test() { const v = await findData(); console.log(v);} test();复制代码
async/await 的特点:
- 可以让异步逻辑用同步写法实现
- 最底层的await返回需要是Promise对象
- 可以通过多层syncfunction的同步写法代替传统的callback嵌套
四、koa2简析结构
源码文件
├── lib│ ├── application.js│ ├── context.js│ ├── request.js│ └── response.js└── package.json复制代码
这个就是 GitHub
- application.js 是整个koa2 的入口文件,封装了context,request,response,以及最核心的中间件处理流程。
- context.js 处理应用上下文,里面直接封装部分request.js和response.js的方法
- request.js 处理http请求
- response.js 处理http响应
koa2特性
- 只提供封装好http上下文、请求、响应,以及基于async/await的中间件容器。
- 利用ES7的async/await的来处理传统回调嵌套问题和代替koa@1的generator,但是需要在node.js 7.x的harmony模式下才能支持async/await。
- 中间件只支持 async/await 封装的,如果要使用koa@1基于generator中间件,需要通过中间件koa-convert封装一下才能使用。