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作为中间件的写法将在koa@3里不支持

  但是用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

koa2的官方文档资料详见http://www.koacn.com/#contexthttps://koa.bootcss.com/#

Koa2实用入门的更多相关文章

  1. JsRender实用入门教程

    这篇文章主要介绍了JsRender实用入门实例,包含了tag else使用.循环嵌套访问父级数据等知识点,并提供了完整的实例下载,非常具有实用价值,需要的朋友可以参考下     本文是一篇JsRend ...

  2. koa2开发入门

    一.koa2入门 1.创建koa2工程 首先,我们创建一个目录hello-koa并作为工程目录用VS Code打开.然后,我们创建app.js,输入以下代码: // 导入koa,和koa 1.x不同, ...

  3. PM2实用入门指南

    简介 PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单. 下面就对PM2进行入门性的介绍,基本涵盖了PM2的常用的功能和 ...

  4. koa2 从入门到进阶之路 (二)

    之前的文章我们已经能够在本地启动一个简单的项目,本章我们来看一下 koa 路由,get 传值,动态路由. 一.Koa 路由 路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP ...

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

    首先我们先来了解一下 Koa 是什么,https://koa.bootcss.com/,这是 Koa 的官方网站,映入眼帘的第一句就是 Koa -- 基于 Node.js 平台的下一代 web 开发框 ...

  6. Gdi+实用入门

    大部分是参照其它资料,然后加以自己的理解,那是什么,总结.算不得什么教程.......汗,自己看着就行了..如果别人能看那就更好了. 首先下载GDI+文件包,一个动态链接库,使用GDI+就是调用那个动 ...

  7. koa2 从入门到进阶之路 (五)

    之前的文章我们介绍了一下 koa 中使用 ejs 模板及页面渲染,本篇文章我们来看一下 koa post提交数据及 koa-bodyparser中间件. 在前端页面中,不免会用到 form 表单和 p ...

  8. koa2 从入门到进阶之路 (四)

    之前的文章我们介绍了一下 koa 中间件 以及 koa 中间件的洋葱图执行流程,本篇文章我们来看一下 koa 中使用 ejs 模板及页面渲染. 在 Express 中,我们经常会用 ejs 模板来渲染 ...

  9. koa2 从入门到进阶之路 (三)

    之前的文章我们介绍了一下 koa 路由,get 传值,动态路由,本节我们看一下 koa 中间件 以及 koa 中间件的洋葱图执行流程. 一.什么是 Koa 的中间件 通俗的讲:中间件就是匹配路由之前或 ...

随机推荐

  1. delphi 安卓程序如何读取外部配置文件

    1)编辑一个config.txt文件,填写配置系统. 2)有外部加载文件时,安卓发布需要另行指定文件发布目录位置 比如加载config.txt需要在 首先利用Project->Deploymen ...

  2. c# 协变和逆变的理解

    1. 是什么 1.1 协变 协变指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型.如 string 到 object 的转换.多见于类型参数用作方法的返回值. 1.2 逆变 逆变指能够 ...

  3. [LeetCode 题解] Search in Rotated Sorted Array

    前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 题目描述 Suppose an array ...

  4. SQL笔记---多表左联

    这是实际场景当中的一个例子,拿出来分析总结思路. -- SQL 查询 --SELECT  orderQuery.Rk_SkuCode ,        orderQuery.SkuName,      ...

  5. NLayerAppV3--DDD之领域层

    回顾:NLayerAppV3是一个使用.net 2.1实现的经典DDD的分层架构的项目. NLayerAppV3是在NLayerAppV2的基础上,使用.net core2.1进行重新构建的:它包含了 ...

  6. 截图-----Selenium快速入门(十二)

    在自动化测试过程中,截图是常见的操作,因为有时候单靠程序无法判断是否已得到期望的结果,所以需要截图判断.又或者截图是作为判断的存证.Selenium的截图操作也是非常简单,而且自带了一个文件操作类Fi ...

  7. [.net]数组

    在C语言中,数组是比较简单,也使用比较多的一种基础的数据结构.常用的有一维数组,二维数组等.但是在C#中,使用最多的是List,Dictionary等一些集合类,因为用他们来操作同类型的数据,比数组更 ...

  8. day 60 Django第一天

    jinjia2 : Jinja2是基于python的模板引擎,功能比较类似于于PHP的smarty,J2ee的Freemarker和velocity. 它能完全支持unicode,并具有集成的沙箱执行 ...

  9. Day 35 验证客户端的合法性+socketserver

    一 .getpeername和getsoketopt的用法 服务器端代码 import socket sk =socket.socket() sk.bind(('127.0.0.1',9000)) s ...

  10. 字符串(tjoi2016,heoi2016,bzoj4556)(sam(后缀自动机)+线段树合并+倍增+二分答案)

    佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了 一个长为\(n\)的字符串\(s\),和\(m\)个问题.佳媛姐姐必须正确回答这\(m\)个问题, ...