zoukankan      html  css  js  c++  java
  • KOA 学习(一)

    一、安装KOA

    用npm下载KOA 

    就会在koa文件夹下生成

    二、输出hello,world

    我下载的KOA版本号是2.0.1

    const Koa = require('koa');
    const app = new Koa();
    
    // response
    app.use(ctx => {
      ctx.body = 'Hello Koa';
    });
    
    app.listen(3000);

    一定注意版本号1.2,应该是这样写的

      let koa = require('koa');
      let app = koa();
      app.use(function*(){
          this.body = "hello xiaomo";
        });
      app.listen(8080);

    刚开始我下载的是2.0版却是照着1.2版本的代码写的会报错。

    三、生成器函数function*

    关键词 function*。这个星号表示这个函数是一个生成器函数。这意味着这个函数可以在运行的时候跳出然后再跳回来。这个概念很难去表述,所以我给你举个栗子。

    function* inc () {
       let number = 0
       while (true)
       yield number++
      }
    
      let test = inc()
    
      console.log(test.next().value) // -> 0
      console.log(test.next().value) // -> 1
      console.log(test.next().value) // -> 2

    我分解一下这个程序:

    inc 函数定义了一个生成器函数,在每一次 while 循环中,产出 number 变量然后 number 变量加 1inc 函数被指派给了变量 test

    inc 函数被迭代了 3 次,第一次的时候,number 变量在函数中被初始化了。然后,这个函数进入到了一个 while 循环,在之后的迭代中这个循环也不会退出。然后 number 0 被产出,所以这个可以用 .value 方法接收。在后来的迭代中这个变量 number 自增了两次。

    我希望这可以帮助理解一点生成器的工作原理。这只是非常复杂的 ES6 中的一小部分。

    但是无论如何,让我们回到 koa。koa 非常简单,甚至不包含一个路由。你需要在中间件生成器函数中手动做路由匹配:

    四、中间件级联

    请求先经过 x-response-time 和 logging 中间件,并记录中间件执行起始时间。 然后将控制权交给 reponse 中间件。当中间件运行到 yield next 时,函数挂起并将控制前交给下一个中间件。当没有中间件执行 yield next 时,程序栈会逆序唤起被挂起的中间件来执行接下来的代码。

    ES7(目前是草案,还没有发布)引入了新的关键字asyncawait,可以轻松地把一个function变为异步模式:

    const Koa = require('koa');
    const app = new Koa();
    
    // x-response-time
    
    app.use(async function (ctx, next) {
      const start = new Date();
      await next();
      const ms = new Date() - start;
      ctx.set('X-Response-Time', `${ms}ms`);
    });
    
    // logger
    
    app.use(async function (ctx, next) {
      const start = new Date();
      await next();
      const ms = new Date() - start;
      console.log(`${ctx.method} ${ctx.url} - ${ms}`);
    });
    
    // response
    
    app.use(ctx => {
      ctx.body = 'Hello World';
    });
    
    app.listen(3000);

    在KOA1.0时实现异步,是这样实现的。

    var koa = require('koa');
    var app = koa();
    
    app.use('/test', function *() {
        yield doReadFile1();
        var data = yield doReadFile2();
        this.body = data;
    });
    
    app.listen(3000);

    在KOA2.0是这样实现的

    app.use(async (ctx, next) => {
        await next();
        var data = await doReadFile();
        ctx.response.type = 'text/plain';
        ctx.response.body = data;
    });

    参考:http://www.tuicool.com/articles/EnuiIj

  • 相关阅读:
    Java之装饰模式
    Sharding-jdbc(一)分库分表理解
    JVM(四)JVM的双亲委派模型
    JVM(三)JVM的ClassLoader类加载器
    JVM(二)JVM的结构
    JVM(一)JVM的概述与运行流程
    Redis随笔(六)RESP的协议规范
    Redis随笔(五)Jedis、jedisCluster的使用
    Collections.synchronizedList使用方法陷阱(1)
    Collections.synchronizedList使用方法
  • 原文地址:https://www.cnblogs.com/myzy/p/6510113.html
Copyright © 2011-2022 走看看