nodeJs--koa2入门

本文介绍了Koa2的背景,作为Express的下一代基于Node.js的web框架,Koa2利用Promise和async函数解决了回调地狱的问题。文章详细阐述了Koa2从创建项目到运行的基本步骤,并探讨了Koa middleware的概念,强调了middleware的顺序和调用的重要性。
摘要由CSDN通过智能技术生成

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;
    }
});

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值