Koa框架介绍、环境搭建以及异步的使用

Koa框架介绍、环境搭建以及异步的使用

十二月 05, 2018

一、Koa框架介绍

Node.js 是一个异步的世界,官方 API 支持的都是 callback 形式的异步编程模型。这会带来许多问题,例如:1、callback 嵌套问题;2、异步函数中可能同步调用 callback 返回数据,带来不一致性。为了解决以上问题,Koa 出现了。
Koa 是一个由 Express 幕后的原班人马打造的 web 框架, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过使用 Es7 中的 async 和 await,Koa 帮你丢弃回调函数,并有力地提升错误处理效率。 Koa 并没有捆绑任何中间件,而是提供了一个轻量优雅的函数库,使得编写服务端应用变得得心应手。
Koa 的开发思路和 express 差不多,最大的特点就是可以避免异步嵌套。Koa基于最新的Es6、Es7语法,运行速度比Express更快。目前阿里就在使用 Koa 框架,并在 Koa 基础上面做了一些扩展和封装开发了一个开源框架 Egg.js。

二、Koa框架的安装使用

1、安装 Node.js 8.x 以上的版本
Koa要求 Node.js 的版本高于 V7.6。因为 Node.js 7.6 版本开始完全支持 async/await,所以才能完全支持我们的 Koa2。
2、安装使用:
首先打开项目文件夹

1
npm init

生成 package.json 来管理项目的各种模块

1
npm install --save koa / cnpm install --save koa

–save 表示自动修改 package.json 文件,自动添加依赖项。

1
2
3
4
5
6
7
8
9
const koa=require('koa');
const app=new koa();

app.use(async(ctx)=>{ //配置中间件 (可以先当做路由)

ctx.body='hello koa'
})

app.listen(3000);

三、Koa常用的ES6语法

1、let和const(都是块作用域)
2、模板字符串

1
2
3
let name='Sam'
let age=20
console.log(`${name}的年龄是${age}`)

3、属性和方法的简写

1
2
3
4
5
6
7
8
9
10
11
let name='Sam'
var app={

name,
run(){

console.log(`${this.name}在跑步`)
}
}

app.run()

4、箭头函数:this 指向上下文,function() 变成 ()=>
5、Promise

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function getData(resolve,reject){

setTimeout(()=>{

var name='Sam'
resolve(name)
},1000);
}

var p=new Promise(getData)

p.then((data)=>{

console.log(data)
})

四、Koa异步处理Async、Await和Promise的使用

async 是“异步”的简写,而 await 可以认为是 async wait 的简写。所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。
简单理解:
async 是让方法变成异步。
await 是等待异步方法执行完成。
详细说明:

1
2
3
4
5
6
7
async function testAsync(){

return 'Hello async';
}

const result = testAsync();
console.log(result);

async 是让方法变成异步,在终端里用 node 执行这段代码,你会发现输出了

1
Promise { 'Hello async' }

即返回的是 Promise。

await 在等待 async 方法执行完毕,其实 await 等待的只是一个表达式,这个表达式在官方文档里说的是 Promise 对象,但是它也可以接受普通值。
注意:await 必须在 async 方法中才可以使用,因为 await 访问本身会造成程序堵塞,所以必须在异步方法中才可以使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
async function getData(){

console.log(2)
}
async function test(){

console.log(1)

var d=await getData()
console.log(d)

console.log(3)
}

test()
//运行结果是1 2 3 await的阻塞功能把异步改成了同步

async/await 同时使用:
async 会将其后的函数(函数表达式或 Lambda)的返回值封装成一个 Promise 对象,而 await 会等待这个 Promise 完成,并将其 resolve 的结果返回出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function findData() {

return new Promise((resolve,reject)=>{

setTimeout(()=>{
var name='Same'
resolve(name)
},1000)
}) //定义一个返回promise的方法
}
async function test() {

const v = await findData()
console.log(v)
}

test()