美文网首页
Node.js - koa入门

Node.js - koa入门

作者: constLy | 来源:发表于2017-08-17 14:06 被阅读0次

摘要 - 廖雪峰JavaScript教程

创建一个koa2工程

首先,我们创建一个test目录,并在目录里面创建一个koa.js文件,输入以下代码:

// 导入的是koa2,不是koa1,koa2是一个class类,所以大写。
const Koa = require('koa')

// 创建一个web app 实例
const app = new Koa()

// 对于任何请求,都执行该回调函数
app.use(async (ctx, next) => {
    await next()
    ctx.response.type = 'text/html'
    ctx.response.body = '<h1> Hello Koa2 </h1>'
})

// 监听9000端口
app.listen(9000, () => {
    console.log('Server is running and the port is 9000 ')
})

其中,参数ctx是koa传入的封装了responseresquest的变量,next是koa要处理的下一个异步函数。
上面的异步函数中,我们首先用await next( )处理下一个异步函数,然后设置Content-Type和内容。
async标记的函数称为异步函数,在异步函数中,可以用await调用另一个异步函数,这两个关键字在ES7中引入。

<font color=red>注意:</font>要是想运行上面的代码,请使用最新的node7以后的版本,因为低版本的node不支持asyncawait关键,或者你可以babel进行转成es5进行运行。


koa middleware

让我们在仔细看下koa的执行逻辑。核心代码是:

app.use(async (ctx, next) => {
    await next()
    ctx.response.type = 'text/html'
    ctx.response.body = '<h1> Hello Koa2 </h1>'
})

每收到一个http请求,koa就会调用通过app.use()注册的异步函数,并传入ctxnext参数。

我们可以对ctx操作,并设置返回内容。但是为什么要调用await next()

原因是koa把很多async函数组成一个处理链,每个async函数都可以做一些自己的事情,然后用await next()来调用下一个async函数。我们把每个async函数称为middleware,这些middleware可以组合起来,完成很多有用的功能。

例如,可以用以下3个middleware组成处理链,依次打印日志,记录处理时间,输出HTML:

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.response.type = 'text/html';
    ctx.response.body = '<h1>Hello, koa2!</h1>';
});

middleware的顺序很重要,也就是调用app.use()的顺序决定了middleware的顺序。

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

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

理解了middleware,我们就基本会用koa了!

最后注意ctx对象有一些简写的方法,例如ctx.url相当于ctx.request.urlctx.type相当于ctx.response.type

相关文章

  • koa2入门系列

    koa2入门系列(一) koa2入门系列(二) koa2入门系列(三) koa2入门系列(四) koa2入门系列(...

  • Node.js - koa入门

    摘要 - 廖雪峰JavaScript教程 创建一个koa2工程 首先,我们创建一个test目录,并在目录里面创建一...

  • Web框架Node.js Koa2 入门需要学什么?

    Web框架Node.js Koa2 入门需要学什么?前端开发需要掌握JS高级应用、异步编程、数据库Sequeliz...

  • uniapp实现热更新

    后端(node.js koa2)

  • 知识点总结

    Koa2中间件 koa(面向node.js的表达式HTTP中间件框架)、koa-router(路由中间件)、koa...

  • Koa2 入门 Koa-body Koa-router

    Koa 入门 koa需要搭配中间件来做接口更方便,使用Koa-body & Koa-router 首先使用npm下...

  • autojsWebSocket通信之手机截图

    koa搭建websocket与autojs通信 软件简介 Koa: 基于 Node.js 平台的下一代 web 开...

  • Koa源码分析(序)

    Koa是基于Node.js平台的下一代web框架。(在这里记录一下之前分析过的Koa)既然是基于Node.js,那...

  • Koa2 还有多久取代 Express

    前言 Koa 是运行在 Node.js 中的 web 服务框架,小而美。 Koa2 是 Koa 框架的最新版本,K...

  • Koa 基础项目搭建

    转载自: Node.js 蚕食计划(五)—— Koa 基础项目搭建 Koa 是由 Express 原班人马打造的超...

网友评论

      本文标题:Node.js - koa入门

      本文链接:https://www.haomeiwen.com/subject/yeogrxtx.html