Koa2实用入门

koa2已发布了一段时间,可以考虑入手,参见Node.js最新Web技术栈(2016年4月)

本文主要是koa 2的文档解读和runkoa介绍,让大家对koa 2有一个更简单直接的理解

一.依赖Node.js 4.0+

Koa requires node v4.0.0 or higher for (partial) ES2015 support.

部分特性需要ES2015,大家可以自己比对一下es6在node不同版本里的支持特性

http://kangax.github.io/compat-table/es6/

二.hello world

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

// 此处开始堆叠各种中间件
//...

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

app.listen(3000);

  注意注释部分,此处开始堆叠各种中间件

三.中间件:Middleware

  Koa 是一个 middleware framework, 它提供了 3 种不同类型的中间件写法

  a.common function
  b.async function(新增)
  c.generatorFunction
  中间件和express的中间件类似,是有顺序的,注意,大部分人都坑死在顺序上

  下面以写一个logger中间件为例,一一阐明

四.最常见的写法

  node sdk就支持的,就是最常见的

app.js

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

app.use((ctx, next) => {
  const start = new Date();
  return next().then(() => {
    const ms = new Date() - start;
    console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
  });
});

// response
app.use(ctx => {
  ctx.body = ‘Hello Koa in app.js‘;
});

app.listen(3000);

五.async/await 函数 (Babel required)

  async/await是异步流程控制更好的解决方案,很多潮人都已经玩起来了,目前node sdk不支持,所以需要babel来转换一下

app-async.js

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

app.use(async (ctx, next) => {
  const start = new Date();
  await next();
  const ms = new Date() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});

// response
app.use(ctx => {
  ctx.body = ‘Hello Koa in app-async.js‘;
});

app.listen(3000);

六.Generator函数

  Generator是node 4(严格是0.12)开始支持的es6特性里的非常重要的一个,用generator和promise实现流程控制,让co充当执行器这一个角色,也是个不错的解决方案

千万别把generator叫成生成器,我们一般习惯把scaffold叫成生成器。

app-generator.js

const Koa = require(‘koa‘);
const app = new Koa();
const co = require(‘co‘);

app.use(co.wrap(function *(ctx, next) {
  const start = new Date();
  yield next();
  const ms = new Date() - start;
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
}));

// response
app.use(ctx => {
  ctx.body = ‘Hello Koa  in app-generator.js‘;
});

app.listen(3000);

七.测试

  启动执行

npm i -g runkoa

runkoa app.js
runkoa app-async.js
runkoa app-generator.js 

  测试发起http请求

$ curl http://127.0.0.1:3000
Hello Koa in app.js

八.v3将移除单纯的以generator作为中间件的写法

  Old signature middleware (v1.x) support will be removed in v3
  实际是koa核心包含了一个叫koa-convert的模块,它里面warning说,以generator作为中间件的写法将在[email protected]里不支持

  但是用co或koa-convert转过的还是可以的,本文的3种写法都是长期支持的

  如下这样写不行:

const Koa = require(‘koa‘);
const app = new Koa();
const co = require(‘co‘);

const convert = require(‘koa-convert‘);

app.use(convert(function *(next) {
  const start = new Date();
  yield next;
  const ms = new Date() - start;
  console.log(`${this.method} ${this.url} - ${ms}ms`);
}));

// response
app.use(ctx => {
  ctx.body = ‘Hello Koa  in app-convert.js‘;
});

app.listen(3000);

  这样写是可以的

const Koa = require(‘koa‘);
const app = new Koa();
const co = require(‘co‘);

// Koa will convert
app.use(function *(next) {
  const start = new Date();
  yield next;
  const ms = new Date() - start;
  console.log(`${this.method} ${this.url} - ${ms}ms`);
});

// response
app.use(ctx => {
  ctx.body = ‘Hello Koa  in app-noconvert.js‘;
});

app.listen(3000);

九.Babel支持

  我本人比较讨厌写babel,对于node sdk不支持的特性持观望态度,比如async/await这样的神器是可以用的,其他的是不一定一定要上的,那就观望好了

  如果在koa 2里用到async/await就需要babel支持了

  a.es2015-node5(nodejs 5.x里支持的es6特性)
  b.stage-3(包含async/await)
  可是,我还是不想用,就几行代码能搞定的事儿,我不想看到babel出现在我的代码里,于是就有了前面用到的runkoa,它的原理也是这样的,不过看起来更clean一些

十.总结

  Node.js 4.x和5.x支持的es特性还是有很大差异的,如果不用到,还好,万一用到就只能babel去转换,还有就是async支持,必须要stage-3,那么也还是需要babel。

  Node.js sdk迟迟不更新很讨厌,babel更新太快也很讨厌
  但是,无论从性能,还是流程控制上,koa 2和它的后宫(中间件)都是非常好的解决方案

文章来源:https://cnodejs.org/topic/5709959abc564eaf3c6a48c8

原文地址:https://www.cnblogs.com/flyingeagle/p/9164887.html

时间: 2024-10-09 17:47:01

Koa2实用入门的相关文章

JsRender实用入门教程

这篇文章主要介绍了JsRender实用入门实例,包含了tag else使用.循环嵌套访问父级数据等知识点,并提供了完整的实例下载,非常具有实用价值,需要的朋友可以参考下 本文是一篇JsRender的实用入门教程,实例讲述了tag else使用.循环嵌套访问父级数据等知识点.分享给大家供大家参考.具体如下: 前言 JsRender是一款基于jQuery的JavaScript模版引擎,它具有如下特点: ·  简单直观 ·  功能强大 ·  可扩展的 ·  快如闪电 这些特性看起来很厉害,但几乎每个模

PM2实用入门指南

http://www.cnblogs.com/chyingp/p/pm2-documentation.html 简介 PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单. 下面就对PM2进行入门性的介绍,基本涵盖了PM2的常用的功能和配置. 安装 全局安装,简直不能更简单. npm install -g pm2 目录介绍 pm2安装好后,会自动创建下面目录.看文件名基本就知道干嘛的了,就不翻译了. $HOME/.pm2

rails简明实用入门指南

先写个目录,慢慢补充 前言 本指南定位为rails官方指南的导读,是为初学者写的. 热身 安装的烦恼 本来rails的安装是很简单的,不过国内的网络环境让rails开发变得更困难了,目前似乎也没什么好的办法. 开始安装 假设ruby已经安装好了,基本的安装本来非常简单 gem install rails -V #-V显示详细,可以不要 接下来生成一个简单的项目 rails new rails-rsg 接下来bundle,bundle就是把需要的都一次安装好 cd rails-rsg bundle

Python_实用入门篇_12

Python内置序列类型之集合类型详解 1.集合概念 具有某种特定性质的事物的总体,集合里的东西叫作元素.Python中,集合(set)是一个无序不重复元素的序列. 2.集合的创建 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典. #第一种创建 parame = {value01,value02,...} 第二种创建 set(value) 注意:集合可以有任意数量的元素,它们可以是不同的类型(例如

koa2 简单入门和 mongoose 使用

1 构建项目 1.1 安装koa-generator $ npm install -g koa-generator 1.2 使用koa-generator生成koa2项目 $ koa2 -e project(项目名称) (-e 代表使用模板引擎ejs) 1.3 进入项目 $ cd project $ npm install 1.4 启动项目,默认端口号是3000 $ DEBUG=koa2-learn:* npm start (该方法在修改文件时需要重新启动服务.不建议使用) $ npm run

koa2 从入门到进阶之路 (一)

首先我们先来了解一下 Koa 是什么,https://koa.bootcss.com/,这是 Koa 的官方网站,映入眼帘的第一句就是 Koa -- 基于 Node.js 平台的下一代 web 开发框架. 在学习 Koa 之前我们应对 Node.js 有一定的基础,我们都知道: Node.js 是一个异步的世界,官方 API 支持的都是 callback 形式的异步编程模型,这会带来许多问题,例如:1.callback 嵌套问题 2.异步函数中可能同步调用 callback 返回 数据,带来不一

Gdi+实用入门

大部分是参照其它资料,然后加以自己的理解,那是什么,总结.算不得什么教程.......汗,自己看着就行了..如果别人能看那就更好了. 首先下载GDI+文件包,一个动态链接库,使用GDI+就是调用那个动态链接库里的函数.类似画图什么的,了解这个主要是想把bmp图片转换成jpg的,然后做个简单屏幕监控,几个月前尝试做了一下,差不多是半分钟才传过来一张图片.知识有限,没办法,那时候,也没怎么上心,就落下了.废话就不多说了,先下载GDI+文件包. GDI+文件包下载地址:www.codeguru.com

Python_实用入门篇_02

Python对象类型 包括数字.字符串.列表.字典.元组.集合 本篇将对这些基本的内置对象类型进行简介 1.对象类型: ①对象类型的概念: 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则.计划或事件.对象的类型决定了该对象可以保存什么类型的值,可以进行怎样的操作,以及遵循什么样的规则. ②Python中的对象类型: Python中一切皆为对象,并使用对象模型来存储数据,构造任何类型的值. ③Python中对象的三个特性: 1.

Python_实用入门篇_03

用户交互以及格式化输出  1.用户交互 ①input函数 input函数等待用户输入,然后前面的变量指向输入的内容,注意,input函数出来的数据类型全是字符串类型 x= input("此括号里的内容会直接打印出来") print(x) 注意:在python3中用input()函数时,输入的所有内容都会被当做字符串去处理,若是需要和一个数字进行比较,就会出错,所以需要用 int() 将输入的字符串转换成数字(前提是输入的本身就是个数字,否则就会报错) ②getpass模块 (还没有看到