从零开始学习Koa(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_17775997/article/details/84932642

一、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.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 就可以看到结果了。 image

三、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 https://github.com/koajs/koa上开源的koa2源码的源文件结构,核心代码就是lib目录下的四个文件

  • 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封装一下才能使用。

猜你喜欢

转载自blog.csdn.net/sinat_17775997/article/details/84932642