1. 前言

现在主流的 Node.js 开发框架 有 Express.js,Koa.js,Egg.js,Nest.js,目前用的最多还是 Koa.js,国内也有很多人用阿里出品基于 Koa.js 封装的 Egg.js,这个专题我们一起来梳理了解 Koa.js 整个使用方法

2. 什么是 Koa

这里引用中文官方网站的原文

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。 既然是 web 框架大家一定不陌生,通过启动一个 node http server,监听一个端口,进而我们就可以通过类似 localhost:3000 在本地访问我们的服务了,这个服务可以是 web 网站,可以是 restful 接口,也可以是静态文件服务等等。

一句话概括就是: Koa 是一个比较优雅 Node.js 的 Web 框架 官网的这段介绍有几个关键词,Express 幕后原版人马利用 async 函数弃回调函数增强错误处理没有捆绑任何中间件,基本上这几个词简洁的表明了它的特点,后面我们会一一介绍

3. Koa 历史

Express Github第一个 tag 是 2010.1.3
Koa Github 第一个 tag 是 2013.11.8,目前一直在保持更新,最新版本到了 2.11.0

2 个框架是一个团队出品的,那大家就好奇了,咋造了一个轮子,又造一个轮子,原因是,随着 Node.js 版本升级,有了些新的语法,比如 Async, Await 在 Express 已有代码基础上继续迭代,会有很多历史包袱,要兼容之前的代码逻辑,还不如重新设计个框架,也是便有了 Koa

Koa 的出现很大一部分原因是解决 Express 一些不好的设计,比如回调地狱,错误处理机制, Koa 又分为 Koa1,Koa2,Koa1 是一个过渡版本,现在主流都是用 Koa2

4. 安装

  1. 安装 Node.js >= v7.6.0 以上版本
  2. $ npm i koa
  3. $ node hello-world.js

如果你本地安装的 Node.js 版本小于 v7.6.0 ,这个版本以下的 Node.js 是不支持 async,所以需要 添加 babel-register 来支持 async建议安装新版本的 Node.js,省去很多麻烦

5. Hello World

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  ctx.body = 'Hello World!';
});

app.listen(3000);

对标下 Express 的 Hello World

const express = require('express')
const app = express()
const port = 3000

app.get('/', (request, response) => res.send('Hello World!'))

app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))

上面 2 段代码都是干了一件事

  1. 启动一个绑定到本地 3000 端口的服务
  2. 访问 http://localhost:3000/ 返回 Hello World!

可以看到 Koa 里面没有了 Express 那样回调方法,用的是 async,看起来舒服很多(特别是代码逻辑非常复杂的时候,代码可读行会大大提升)

6. Koa 里面几个重要的概念

6.1. 上下文 Context

Context 是 Koa 里面最重要的一个概念,使用的时候经常会写成 ctx, 上下文贯穿了整个框架,理解 koa 第一步,就是要搞清楚上下文的作用

例如:你有个一个登录页面,填好用户名,密码后发一个请求到 Koa 服务的接口,处理完成后返回一个 Response 对象,对应的后端接口,会包含用户的登录信息,或者一些 Token 之类的信息,这些信息就是上下文的一部分, 类似下面这种

// 模拟登录接口
app.use(async ctx => {
  const {userName,password} = ctx.request;
  ctx.body = 'Hello World!';
});

Koa 的 Context 把 Http 协议里面 的 Request, Response 对象封装进一个单独对象, 并提供许多开发 Web 应用和 Apis 有用的方法. 那些在 Http Server 开发中使用非常频繁操作, 直接在 Koa 里实现, 而不是放在更高层次的框架, 这样中间件就不需要重复实现这些通用的功能。

6.2. async,await

大家都知道 async ,await 的出现解决了 JavaScript 里面令人头疼的 回调地狱问题,代码可读行大大提高,Koa 里面也是大量的用到

6.3. 中间件 middleware

先想想下一个业务场景,我们在页面上会有请求后端很多接口,为了安全,接口肯定是验证用户信息的,比如检验下 token,但是我们又不能每个请求接口里面都去写一遍校验逻辑,这样就需要进入每个请求之前,先走 用户信息校验模块,这种组织方式就叫中间件

还有比如,统计每个请求的使用次数,打印请求日志,中间件的核心离不开了还有洋葱模型,这些在后面会详细解释

7 小结

这章主要是对 Koa.js 做一个简单介绍,主要讲了 Koa.js 诞生,历史,主要组成部分-/;。