[Node.js基础]学习⑩--koa2入门

http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001471087582981d6c0ea265bf241b59a04fa6f61d767f6000

Express是第一代最流行的web框架,它对Node.js的http进行了封装
Express的团队又基于ES6的generator重新编写了下一代web框架koa。

创建一个目录hello-koa并作为工程目录。创建app.js

'use strict';
// 导入koa,和koa 1.x不同,在koa2中,我们导入的是一个class,因此用大写的Koa表示:
const Koa = require('koa');

// 创建一个Koa对象表示web app本身:
const app = new Koa();

// 对于任何请求,app将调用该异步函数处理请求:
app.use(async (ctx, next) => {
    await next();
     // 设置response的Content-Type:
    ctx.response.type = 'text/html';
    // 设置response的内容:
    ctx.response.body = '

Hello, koa2!

'; }); // 在端口3000监听: app.listen(3000); console.log('app started at port 3000...');

await next();处理下一个异步函数

koa安装

⒈npm命令直接安装koa

npm install [email protected]

npm会把koa2以及koa2依赖的所有包全部安装到当前目录的node_modules目录下。

⒉在hello-koa这个目录下创建一个package.json,这个文件描述了我们的hello-koa工程会用到哪些包。

{
    "name": "hello-koa2",
    "version": "1.0.0",
    "description": "Hello Koa 2 example with async",
    "main": "app.js",
    "scripts": {
        "start": "node app.js"
    },
    "keywords": [
        "koa",
        "async"
    ],
    "author": "Michael Liao",
    "license": "Apache-2.0",
    "repository": {
        "type": "git",
        "url": "https://github.com/michaelliao/learn-javascript.git"
    },
    "dependencies": {
        "koa": "2.0.0"
    }
}

hello-koa目录下执行npm install

C:\...\hello-koa> npm install

工程结构

hello-koa/
|
+- .vscode/
|  |
|  +- launch.json <-- VSCode 配置文件
|
+- app.js <-- 使用koa的js
|
+- package.json <-- 项目描述文件
|
+- node_modules/ <-- npm安装的所有依赖包

在package.json中添加依赖包:

"dependencies": {
    "koa": "2.0.0"
}

执行app.js

node --debug-brk=40645 --nolazy app.js 
Debugger listening on port 40645
app started at port 3000...
[Node.js基础]学习⑩--koa2入门_第1张图片
Paste_Image.png

koa middleware

每收到一个http请求,koa就会调用通过app.use()注册的async函数,并传入ctx和next参数。
koa把很多async函数组成一个处理链,每个async函数都可以做一些自己的事情,然后用await next()来调用下一个async函数。

'use strict';

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

app.use(async (ctx, next) => {
    console.log("aaaa1111");
    // 打印URL
    console.log(`${ctx.request.method} ${ctx.request.url}`);
    // 调用下一个middleware
    await next();
    console.log("aaaa2222");
});

app.use(async (ctx, next) => {
    console.log("bbbb1111");
    // 当前时间
    const start = new Date().getTime();
    // 调用下一个middleware
    await next();
    // 耗费时间
    const ms = new Date().getTime() - start;
    // 打印耗费时间
    console.log(`Time: ${ms}ms`);
    console.log("bbbb2222");
});

app.use(async (ctx, next) => {
    console.log("cccc1111");
    await next();
    ctx.response.type = 'text/html';
    ctx.response.body = '

Hello,koa2!

'; console.log("cccc2222"); }); app.listen(3000); console.log('app started at port 3000...');

如果一个middleware没有调用await next(),会怎么办?答案是后续的middleware将不再执行了。这种情况也很常见,例如,一个检测用户权限的middleware可以决定是否继续处理请求,还是直接返回403错误:

app.use(async (ctx, next) => {
    if (await checkUserPermission(ctx)) {
        await next();
    } else {
        ctx.response.status = 403;
    }
});

ctx对象有一些简写的方法,例如ctx.url相当于ctx.request.url,ctx.type相当于ctx.response.type。

你可能感兴趣的:([Node.js基础]学习⑩--koa2入门)