Koa与Node.js的那些事儿---初识Koa

190 阅读3分钟

微信图片_20220930162857.png

用简明扼要的方式组织和分享每一篇技术心得,就从Koa2.x与Node.js开始。

一、Koa介绍

Koa是基于Node.js的Web框架。特点是:轻量、健壮、富有表现力,目前版本Koa2.x。

二、Koa2.x与Express的对比

Express

  1. Express是Koa2.x的上一代Node.js框架。
  2. Express 4之前主要是基于Connect。
  3. Express基于Connect封装了大量便利的功能,如:路由、视力处理、错误处理等。
  4. Express 4之后不再依赖Connect,除express.static外,其余内置的中间件都作为单独的模块安装。
  5. Express 采用ES5语法,异步操作通过回调函数来处理,在处理异步任务时,多层级嵌套下,出现了著名的"回调地狱"问题。

Koa2.x

  1. Koa2.x是新一代Node.js框架。
  2. Koa2.x对异步的操作采用ES7的语法中的async/await + promise进行处理
  3. Koa2.x不在内核方法中绑定任何中间件,所有功能都需要引用第三方中间件来实现,也可以由开发者根据业务和项目进行定制。
  4. Koa2.x的第三方中间件社区非常成熟和丰富。

三、实例对比Express与Koa2.x之间的区别

// Express 版 "Hello World". 
var express = require('express');
var app = express();
app.get('/', function (req, res) {
    asyncFunction(params, function () {
        asyncFunction(params, function () {
            res.send('Hello World!')
        });
    });
});
var server = app.listen(3000);
// Express 自带的路由处理中间件处理了根路由,根路由的回调函数中执行了3个异步函数,形成了著名的"回调地狱",如果异步函数更多一些,会严影响代码的可读性。




Koa2.x"Hello World"
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next) = > {
    await next();
    await asyncFunction(params);
    await asyncFunction(params);
    await asyncFunction(params);
    ctx.response.type = 'text/html';
    ctx.response.body = '<h1>Hello World</h1>';
});
app.listen(3000, () => {
    console.log('server is running at http://localhost:3000')
});

// 上述koa2.x版本支持原生的async/await语法,极大增加了代码的可读性,维护成本,可扩展性也大大降低。

四、Koa的安装、以及Koa项目的搭建

1.新建文件夹koa2-tutorial目录为项目名称,进入koa2-tutorial目录,生成配置文件package.json,初始化命令如下图所示:

1664531123947.png

2.在当前目录下新建app.js文件,进输入以下代码:

1664531487428.png

  1. 打开控制台,或者在vscode新建terminal终端,执行命令,如图所示:

1664531691970.png

4.如果控制台终端成功输出Hello World, 说明环境正常,项目初始化完成,项目的结构如下图所示:

1664530944120.png

5.安装Koa,在koa2-toturial目录下,打开终端,输入命令,如下图所示:

1664532163723.png

如果通过国外境像安装失败,可以尝试国内淘宝境像,如下图所示:

1664532961044.png

6.启动服务器

Koa安装完成后,修改app.js文件,代码如下:

const Koa = require('koa');
const app = new Koa();
app.use(asnyc (ctx, next) => {
    await next();
    ctx.response.type = 'text/html';
    ctx.response.body = '<h1>Hello World</h1>';
});
app.listen(3000, () => {
    console.log('server is running at http://localhost:3000');
});

保存上面的代码,在终端运行node app.js,浏览器访问:http://localhost:3000,一切正常情况下,浏览器会显示"Hello World".

至此,Koa的安装、以及Koa项目的搭建完成。

五、Koa的Context(上下文)对象概述

  1. Koa将Node.js的Request(请求)和Response(响应)对象封装到Context对象中。
  2. 每一次请求会话都会产生属于这次请求的独立的上下文环境(即Context对象)。
  3. 该对象可控制服务端返回给用户端的内容。
  4. Context对象内置属性:
    context.state
    context.app
    context.cookies
    context.throw
    这些属性能够实现很多功能,如路由控制、读取Cookie、响应客户端内容等,除了内置属性,还可以自定义一些属性供会话过程使用。

上文说到,每一个请求会话都将创建一个属于这次请求的独立的Context对象,这个对象会以所有中间件中被作为参数进行引用,代码如下:

app.use(async ctx => {
    ctx; // 这是Context
    ctx.request;  // Koa的request 
    ctx.response; // Koa的response
    
    this;  // this指向Context
    this.request; // Koa的request
    this.response; // Koa的response
}); 

上面代码中演示了访问Context对象的两种方式:一种是ctx通过参数方式访问,另一种是通过this访问。

时间有限,今天暂且到这,下篇我们接着基于Koa的Context对象来分享Context常用属性和方法。