1、koa2背景
Express简介:
koa是Express的下一代基于Node.js的web框架,目前有1.x和2.0两个版本. 虽然Express的API很简单,但是它是基于ES5的语法,要实现异步代码,只有一个方法:回调。
如果异步嵌套层次过多,代码写起来就非常难看, 虽然可以用async这样的库来组织异步代码,但是用回调写异步实在是太痛苦了!
koa 1.0简介:
随着新版Node.js开始支持ES6,Express的团队又基于ES6的generator重新编写了下一代web框架koa。和Express相比,koa 1.0使用generator实现异步。
var koa = require('koa'); var app = koa(); app.use('/test', function *() { yield doReadFile1(); var data = yield doReadFile2(); this.body = data; });
app.listen(3000);
用generator实现异步比回调简单了不少,但是generator的本意并不是异步。Promise才是为异步设计的,但是Promise的写法……想想就复杂。因此2.0应运而生。
koa 2.0简介:
koa团队并没有止步于koa 1.0,他们非常超前地基于ES7开发了koa2,和koa 1相比,koa2完全使用Promise并配合async来实现异步。
app.use(async (ctx, next) => { await next(); //ctx -- context上下文:ctx是Koa传入的封装了request和response的变量 ctx.response.type = 'text/html'; ctx.response.body = '<h1>Hello, Koa2!</h1>' });
什么感觉?是不是很爽?异步-同步的感觉
2、koa2入门
步骤一:新建文件夹 learnKoa
步骤二:新建 app.js
'use strict'; const Koa = require('koa'); const app = new Koa(); app.use(async (ctx, next) => { await next(); //ctx -- context上下文:ctx是Koa传入的封装了request和response的变量 ctx.response.type = 'text/html'; ctx.response.body = '<h1>Hello, Koa2!</h1>' })
app.listen(3000)
console.log('app started at port 3000...')
步骤三:新建 package.json
{ "name": "learn-koa2", "version": "1.0.0", "description": "learn Koa 2", "main": "app.js", "scripts": { "start": "node app.js" }, "keywords": [ "koa", "async" ], "author": "david pan", "dependencies": { "koa": "2.0.0" } }
步骤四:npm install
步骤五:npm run start, 浏览器打开http://localhost:3000/,恭喜你,踏上新的征途!
3、koa middleware
async函数称为middleware
'use strict'; const Koa = require('koa'); const app = new Koa();
app.use(async (ctx, next) => {
console.log(`${ctx.request.method} ${ctx.request.url}`);
// 打印URL
await next();
// 调用下一个middleware
});
app.use(async (ctx, next) => {
const start = new Date().getTime();
// 当前时间
await next();
// 调用下一个middleware
const ms = new Date().getTime() - start;
// 耗费时间
console.log(`Time: ${ms}ms`);
// 打印耗费时间
});
app.use(async (ctx, next) => {
await next();
//ctx -- context上下文:ctx是Koa传入的封装了request和response的变量
ctx.response.type = 'text/html';
ctx.response.body = '<h1>Hello, Koa2!</h1>'
});
app.listen(3000);
console.log('app started at port 3000...');
注意点:
a. koa把很多async函数组成一个处理链,每个async函数都可以做一些自己的事情,然后用await next()来调用下一个async函数。
b. middleware的顺序很重要,也就是调用app.use()的顺序决定了middleware的顺序。
c. 如果一个middleware没有调用await next(), 后续的middleware将不再执行。
例如:一个检测用户权限的middleware可以决定是否继续处理请求,还是直接返回403错误
app.use(async (ctx, next) => { if (await checkUserPermission(ctx)) { await next(); } else { ctx.response.status = 403; } });
————————————————
版权声明:本文为CSDN博主「空谷足音 -จุ」的原创文章