用简明扼要的方式组织和分享每一篇技术心得,就从Koa2.x与Node.js开始。
一、Koa介绍
Koa是基于Node.js的Web框架。特点是:轻量、健壮、富有表现力,目前版本Koa2.x。
二、Koa2.x与Express的对比
Express
- Express是Koa2.x的上一代Node.js框架。
- Express 4之前主要是基于Connect。
- Express基于Connect封装了大量便利的功能,如:路由、视力处理、错误处理等。
- Express 4之后不再依赖Connect,除express.static外,其余内置的中间件都作为单独的模块安装。
- Express 采用ES5语法,异步操作通过回调函数来处理,在处理异步任务时,多层级嵌套下,出现了著名的"回调地狱"问题。
Koa2.x
- Koa2.x是新一代Node.js框架。
- Koa2.x对异步的操作采用ES7的语法中的async/await + promise进行处理
- Koa2.x不在内核方法中绑定任何中间件,所有功能都需要引用第三方中间件来实现,也可以由开发者根据业务和项目进行定制。
- 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,初始化命令如下图所示:
2.在当前目录下新建app.js文件,进输入以下代码:
- 打开控制台,或者在vscode新建terminal终端,执行命令,如图所示:
4.如果控制台终端成功输出Hello World, 说明环境正常,项目初始化完成,项目的结构如下图所示:
5.安装Koa,在koa2-toturial目录下,打开终端,输入命令,如下图所示:
如果通过国外境像安装失败,可以尝试国内淘宝境像,如下图所示:
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(上下文)对象概述
- Koa将Node.js的Request(请求)和Response(响应)对象封装到Context对象中。
- 每一次请求会话都会产生属于这次请求的独立的上下文环境(即Context对象)。
- 该对象可控制服务端返回给用户端的内容。
- 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常用属性和方法。