继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【Koa 极速指南】基础篇

一俢
关注TA
已关注
手记 82
粉丝 12
获赞 135

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

  • 安装

  • Hello Koa

  • ABC

    • 级联

    • app.listen

    • app.use

    • error

    • cookies

  • 中间件

    • koa-router

    • koa-bodyparser

安装

npm i koaOryarn add koa

Hello Koa

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

app.use(async ctx => {
    ctx.body = 'Hello Koa';
});

app.listen(3000, () => {
    console.log('http://localhost:3000/');
});

ABC

级联

Koa 是一种 AOP(面向切面的编程)模式,它采用所谓的洋葱模型,使用者可以通过级联的方式顺序调用中间件。在使用上类似于 jQuery 的链式调用,但是在调用上更像洋葱一样一层一层从外向内的进入,然后从内向外的出来。这种方式更像 AOP 一样,它更好的解决了异步调用,更加符合 Node 设计初衷,将复杂的逻辑解耦到各个中间件中去,并且是一种高性能的异步 I/O 模式(因为它继承于 event 模块)。

下面的代码是在演示 Koa 的级联方式:

const Koa = require('koa');const app = new Koa();// loggerapp.use(async (ctx, next) => {    await next();    const rt = ctx.response.get('X-Response-Time');    console.log(`${ctx.method} ${ctx.url} - ${rt}`);
});// x-response-timeapp.use(async (ctx, next) => {    const start = Date.now();    await next();    const ms = Date.now() - start;
    ctx.set('X-Response-Time', `${ms}ms`);
});// responseapp.use(async ctx => {
    ctx.body = 'Hello World';
});

app.listen(3000);

app.listen

直接看源代码:https://github.com/koajs/koa/blob/master/lib/application.js

const http = require('http');// ...listen(...args) {
    debug('listen');    const server = http.createServer(this.callback());    return server.listen(...args);
}

app.use

将给定的中间件方法添加到此应用程序,看代码:

use(fn) {    if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');    if (isGeneratorFunction(fn)) {
      deprecate('Support for generators will be removed in v3. ' +                'See the documentation for examples of how to convert old middleware ' +                'https://github.com/koajs/koa/blob/master/docs/migration.md');
      fn = convert(fn);
    }
    debug('use %s', fn._name || fn.name || '-');    this.middleware.push(fn);    return this;
}

error

我们可以通过添加 error 事件来监听整个程序的错误:

app.on('error', err => {
    log.error('server error', err)
});

cookie

我们可以通过 Koa 的上下文来读写 cookie

  • ctx.cookies.get(name, [options])

  • ctx.cookies.set(name, value, [options])

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

app.use(async (ctx) => {

    ctx.cookies.set(        'cid',        'hello world',
        {            domain: 'localhost',  // 写cookie所在的域名
            path: '',       // 写cookie所在的路径
            maxAge: 10 * 60 * 1000, // cookie有效时长
            expires: new Date('2019-03-15'),  // cookie失效时间
            httpOnly: false,  // 是否只用于http请求中获取
            overwrite: false  // 是否允许重写
        }
    );
    ctx.body = 'cookie is ok';
});

app.listen(3000, () => {    console.log('[demo] cookie is starting at port 3000')
});

中间件

koa-router

路由中间件是个大框架都提供的,也是非常重要的,它可以让业务逻辑分散到各个不同的资源中去:

const Koa = require('koa');const Router = require('koa-router');const app = new Koa();const router = new Router();

router.get('/hello', (ctx, next) => {
    ctx.body = 'Hello';
});

router.get('/test', (ctx, next) => {
    ctx.body = 'Test';
});

app
    .use(router.routes())
    .listen(3000, () => {
        console.log('http://localhost:3000/');
    });

koa-bodyparser

用来解析 HTTP body 部分的,支持 json、form 和 text 类型的 body

var Koa = require('koa');var bodyParser = require('koa-bodyparser');var app = new Koa();
app.use(bodyParser());

app.use(async ctx => {    // the parsed body will store in ctx.request.body
    // if nothing was parsed, body will be an empty object {}
    ctx.body = ctx.request.body;
});

总结

Koa.js 作为一个web框架,总结出来只提供了两种能力:

  • HTTP 服务

  • 中间件机制

〖坚持的一俢〗



打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP