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作为中间件的写法将在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/#context,https://koa.bootcss.com/#。
Koa2实用入门的更多相关文章
- JsRender实用入门教程
这篇文章主要介绍了JsRender实用入门实例,包含了tag else使用.循环嵌套访问父级数据等知识点,并提供了完整的实例下载,非常具有实用价值,需要的朋友可以参考下 本文是一篇JsRend ...
- koa2开发入门
一.koa2入门 1.创建koa2工程 首先,我们创建一个目录hello-koa并作为工程目录用VS Code打开.然后,我们创建app.js,输入以下代码: // 导入koa,和koa 1.x不同, ...
- PM2实用入门指南
简介 PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单. 下面就对PM2进行入门性的介绍,基本涵盖了PM2的常用的功能和 ...
- koa2 从入门到进阶之路 (二)
之前的文章我们已经能够在本地启动一个简单的项目,本章我们来看一下 koa 路由,get 传值,动态路由. 一.Koa 路由 路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP ...
- koa2 从入门到进阶之路 (一)
首先我们先来了解一下 Koa 是什么,https://koa.bootcss.com/,这是 Koa 的官方网站,映入眼帘的第一句就是 Koa -- 基于 Node.js 平台的下一代 web 开发框 ...
- Gdi+实用入门
大部分是参照其它资料,然后加以自己的理解,那是什么,总结.算不得什么教程.......汗,自己看着就行了..如果别人能看那就更好了. 首先下载GDI+文件包,一个动态链接库,使用GDI+就是调用那个动 ...
- koa2 从入门到进阶之路 (五)
之前的文章我们介绍了一下 koa 中使用 ejs 模板及页面渲染,本篇文章我们来看一下 koa post提交数据及 koa-bodyparser中间件. 在前端页面中,不免会用到 form 表单和 p ...
- koa2 从入门到进阶之路 (四)
之前的文章我们介绍了一下 koa 中间件 以及 koa 中间件的洋葱图执行流程,本篇文章我们来看一下 koa 中使用 ejs 模板及页面渲染. 在 Express 中,我们经常会用 ejs 模板来渲染 ...
- koa2 从入门到进阶之路 (三)
之前的文章我们介绍了一下 koa 路由,get 传值,动态路由,本节我们看一下 koa 中间件 以及 koa 中间件的洋葱图执行流程. 一.什么是 Koa 的中间件 通俗的讲:中间件就是匹配路由之前或 ...
随机推荐
- 1. Two Sum [Array] [Easy]
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- WebService 工作原理及实例教程
一.WebService到底是什么? 先来看下标准的定义:Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统 ...
- leetcode 最后一个单词的长度
给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: &quo ...
- Netbeans8.1设置Consola字体并解决中文乱码问题
netbeans是php非常好用的ide,并且还是免费的!但是好多字体不支持中文,会显示如下乱码: 解决方法如下: 通过修改jre的配置文件成功解决了这个问题. 1. 进入jdk安装目录下/jre/l ...
- OpenStack qemu-guest-agent 使用
What is qemu-ga 我个人认为qemu-ga是在虚拟机中安装的一个agent,宿主机host通过通道(unix socket)与虚拟机vm内部的agent进行通信,这样宿主机就有了一种从外 ...
- “全栈2019”Java多线程第二十四章:等待唤醒机制详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 世界线(bzoj2894)(广义后缀自动机)
由于春希对于第二世代操作的不熟练,所以刚使用完\(invasion process\)便掉落到了世界线之外,错综复杂的平行世界信息涌入到春希的意识中.春希明白了事件的真相. 在一个冬马与雪菜同时存在的 ...
- FunDA(5)- Reactive Streams:Play with Iteratees
FunDA的设计目标就是把后台数据库中的数据搬到内存里,然后进行包括并行运算的数据处理,最后可能再对后台数据库进行更新.如果需要把数据搬到内存的话,那我们就必须考虑内存是否能一次性容纳所有的数据,有必 ...
- 查看SMB服务器用户
查看SMB服务器用户:pdbedit -L 查看SMB服务器运行状态:service smb status
- springmvc 简单框架
1.依赖 2.web.xml配置: 3.springmvc配置文件: 4.Controller 5.index.jsp页面: 6.hello.jsp 7.效果: