一、Koa 框架介绍
Node.js 是一个异步的世界,官方 API 支持的都是 callback 形式的异步编程模型,这 会带来许多问题,例如:1、callback 嵌套问题 2、异步函数中可能同步调用 callback 返回 数据,带来不一致性。为了解决以上问题 Koa 出现了。
Koa
-- 基于 Node.js 平台的下一代 web 开发框架
koa
是由Express
原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 使用 koa 编写 web 应用,可以免除重复繁琐的回调函数嵌套, 并极大地提 升错误处理的效率。koa 不在内核方法中绑定任何中间件, 它仅仅提供了一个轻量优雅的 函数库,使得编写 Web 应用变得得心应手。开发思路和 express 差不多,最大的特点就是 可以避免异步嵌套。
Koa 学习网站:
- 英语官网:koajs.com
- 中文官网:www.itying.com/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.json
npm init
# 安装koa2
npm install --save koa / cnpm install --save koa
复制代码
简单使用:
/引入 Koa
const 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
复制代码
然后在浏览器中输入:http://127.0.0.1:3000 就可以看到结果了。
三、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 github.com/koajs/koa上开…
- 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封装一下才能使用。