文章目录

  • 简介
  • koa和express
  • koa使用介绍
    • 中间件的级联关系
    • koa的构造函数
    • 启动http server
    • 自定义中间件
    • 异常处理

简介

熟悉Spring MVC的朋友应该都清楚Spring MVC是基于servlet的代码框架,这是最传统的web框架。然后在Spring5中引入了Spring WebFlux,这是基于reactive-netty的异步IO框架。

同样的,nodejs在最初的Express 3基础上发展起来了异步的koa框架。koa使用了promises和aysnc来避免JS中的回调地狱,并且简化了错误处理。

今天我们要来介绍一下这个优秀的nodejs框架koa。

koa和express

koa不再使用nodejs的req和res,而是封装了自己的ctx.request和ctx.response。

express可以看做是nodejs的一个应用框架,而koa则可以看成是nodejs 的http模块的抽象。

和express提供了Middleware,Routing,Templating,Sending Files和JSONP等特性不同的是,koa的功能很单一,如果你想使用其他的一些功能比如routing,sending files等功能,可以使用koa的第三方中间件。

koa并不是来替换express的,就像spring webFlux并不是用来替换spring MVC的。koa只是用Promises改写了控制流,并且避免了回调地狱,并提供了更好的异常处理机制。

koa使用介绍

koa需要node v7.6.0+版本来支持ES2015和async function。

我们看一个最最简单的koa应用:

const Koa = require('koa');
const app = module.exports = new Koa();app.use(async function(ctx) {ctx.body = 'Hello World';
});if (!module.parent) app.listen(3000);

koa应用程序就是一个包含了很多个中间件的对象,这些中间件将会按照类似stack的执行顺序一个相应request。

中间件的级联关系

koa.use中传入的是一个function,我们也可以称之为中间件。

koa可以use很多个中间件,举个例子:

const Koa = require('koa');
const app = new Koa();app.use(async (ctx, next) => {await next();console.log('log3');
});app.use(async (ctx, next) => {await next();console.log('log2');
});app.use(async ctx => {console.log('log3');
});app.listen(3000);

上面的例子中,我们调用了多次next,只要我们调用next,调用链就会传递到下一个中间件进行处理,一直到某个中间件不再调用next
为止。

上面的代码运行输出:

log1
log2
log3

koa的构造函数

我们看下koa的构造函数:

constructor(options) {super();options = options || {};this.proxy = options.proxy || false;this.subdomainOffset = options.subdomainOffset || 2;this.proxyIpHeader = options.proxyIpHeader || 'X-Forwarded-For';this.maxIpsCount = options.maxIpsCount || 0;this.env = options.env || process.env.NODE_ENV || 'development';if (options.keys) this.keys = options.keys;this.middleware = [];this.context = Object.create(context);this.request = Object.create(request);this.response = Object.create(response);// util.inspect.custom support for node 6+/* istanbul ignore else */if (util.inspect.custom) {this[util.inspect.custom] = this.inspect;}}

可以看到koa接收下面几个参数:

  • app.env 默认值是NODE_ENV或者development
  • app.keys 为cookie签名的keys

看下怎么使用:

app.keys = ['secret1', 'secret2'];
app.keys = new KeyGrip(['secret1', 'secret2'], 'sha256');ctx.cookies.set('name', 'jack', { signed: true });
  • app.proxy 是否支持代理
  • app.subdomainOffset 表示子域名是从第几级开始的,这个参数决定了request.subdomains的返回结果,默认值为2
  • app.proxyIpHeader proxy ip header默认值是X-Forwarded-For
  • app.maxIpsCount 从proxy ip header读取的最大ip个数,默认值是0表示无限制。

我们可以这样用:

const Koa = require('koa');
const app = new Koa({ proxy: true });

或者这样用:

const Koa = require('koa');
const app = new Koa();
app.proxy = true;

启动http server

koa是一种web框架,web框架就需要开启http服务,要启动http服务,需要调用nodejs中的Server#listen()方法。

在koa中,我们可以很方便的使用koa#listen方法来启动这个http server:

const Koa = require('koa');
const app = new Koa();
app.listen(3000);

上面的代码相当于:

const http = require('http');
const Koa = require('koa');
const app = new Koa();
http.createServer(app.callback()).listen(3000);

当然你可以同时创建http和https的服务:

const http = require('http');
const https = require('https');
const Koa = require('koa');
const app = new Koa();
http.createServer(app.callback()).listen(3000);
https.createServer(app.callback()).listen(3001);

自定义中间件

koa中的中间件是参数值为(ctx, next)的function。在这些方法中,需要手动调用next()以传递到下一个middleware。

下面看一下自定义的中间件:

async function responseTime(ctx, next) {const start = Date.now();await next();const ms = Date.now() - start;ctx.set('X-Response-Time', `${ms}ms`);
}app.use(responseTime);
  • 给中间件起个名字:

虽然中间件function只接收参数(ctx, next),但是我可以将其用一个wrapper方法包装起来,在wrapper方法中,我们给中间件起个名字 :

function logger(name) {return async function logger(ctx, next) {console.log(name);await next();};
}
  • 自定义中间件的扩展:

上面的wrapper创建方式还有另外一个好处,就是可以在自定义中间件中访问传入的参数,从而可以根据传入的参数,对自定义中间件进行扩展。

function logger(format) {format = format || ':method ":url"';return async function (ctx, next) {const str = format.replace(':method', ctx.method).replace(':url', ctx.url);console.log(str);await next();};
}app.use(logger());
app.use(logger(':method :url'));
  • 组合多个中间件:

当有多个中间件的情况下,我们可以使用compose将其合并:

const compose = require('koa-compose');
const Koa = require('koa');
const app = module.exports = new Koa();// x-response-timeasync function responseTime(ctx, next) {const start = new Date();await next();const ms = new Date() - start;ctx.set('X-Response-Time', ms + 'ms');
}// loggerasync function logger(ctx, next) {const start = new Date();await next();const ms = new Date() - start;if ('test' != process.env.NODE_ENV) {console.log('%s %s - %s', ctx.method, ctx.url, ms);}
}// responseasync function respond(ctx, next) {await next();if ('/' != ctx.url) return;ctx.body = 'Hello World';
}// composed middlewareconst all = compose([responseTime,logger,respond
]);app.use(all);if (!module.parent) app.listen(3000);

异常处理

在koa中怎么进行异常处理呢?

通用的方法就是try catch:


app.use(async (ctx, next) => {try {await next();} catch (err) {err.status = err.statusCode || err.status || 500;throw err;}
});

当然你也可以自定义默认的error处理器:

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

我们还可以传入上下文信息:

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

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/koa-startup/

本文来源:flydean的博客

欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

第四代Express框架koa简介相关推荐

  1. Node 简介、模块、模板引擎、NPM、文件操作、缓冲区、文件流、网络操作、Express框架

    一.Node简介 1.1 客户端的JavaScript是怎样的 问题 答 什么是 JavaScript 脚本语言 运行在浏览器中 一般用来做客户端页面的交互(Interactive) JavaScri ...

  2. node mysql和koa_2019年NodeJS框架Koa和Express选型比较

    Koa和Express都是NodeJS的主流应用开发框架. Express是一个完整的nodejs应用框架.Koa是由Express团队开发的,但是它有不同的关注点.Koa致力于核心中间件功能.nod ...

  3. Node.js 应用开发详解04 3 大主流系统框架:由浅入深分析 Express、Koa 和 Egg.js

    上一讲我们没有应用任何框架实现了一个简单后台服务,以及一个简单版本的 MSVC 框架.本讲将介绍一些目前主流框架的设计思想,同时介绍其核心代码部分的实现,为后续使用框架优化我们上一讲实现的 MSVC ...

  4. NodeJs——(14)express框架的send()方法简介

    (35)express框架的send方法 ①send方法用的还挺多的,因此需要明确其作用: ②原型是: res.send([body|status], [body]) 即既可以直接发送内容,也可以第一 ...

  5. Express框架简介(详细)

    下面是对Express框架的简单介绍,希望可以帮助到有需要的小伙伴~ Express框架是什么 Express是一个基于Node平台的web应用开发框架,它提供了一系列的强大特性,帮助你创建各种Web ...

  6. Express框架简介

    Express框架是什么 Express是一个基于Node平台的web应用开发框架,它提供了一系列的强大特性,帮助你创建各种Web应用,我们可以使用npm install express 命令进行下载 ...

  7. Node.js Express 框架 Express

    Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速 ...

  8. 浅谈Http模块,Express和Koa实现http服务

    前言 利用node直接实现服务器是运用http模块,Express和Koa都是在其上做的封装, 这篇wiki只是想直观的看看封装前后基本使用上的不同,先不去考虑深入的东西. 一.http模块 1.1 ...

  9. 如何搭建html运行环境,搭建基于express框架运行环境的方法步骤

    一.Express简介 Express提供了一个轻量级模块,把Node.js的http模块功能封装在一个简单易用的接口中.Express也扩展了http模块的功能,使你轻松处理服务器的路由.响应.co ...

最新文章

  1. android hal 驱动,AndroidHAL-Teseo
  2. Zookeeper_实际应用讲解
  3. 史上最气人的数学家:文理双全智商还高,说话只说半句,解题只解半个,调戏人调戏了三百年还不够......
  4. iOS Xcode7.2 is Not on Any Development Teams
  5. MongoDB的web可视化管理工具
  6. 熊猫烧香源码分析_熊猫体育分析入门
  7. 计算机硬件广告语,硬件防毒广告宣传语
  8. 基于C语言的Q格式使用详解
  9. Centos 普通用户su到root用户提示错误
  10. 复合梯形的matlab求解,MATLAB 利用复合梯形公式求解积分
  11. 物联网平台在AIoT领域8大场景应用
  12. SVG格式化<PATH>说明
  13. java绘制棋盘_java绘制五子棋棋盘
  14. VB程序设计教程(第四版)龚沛曾 实验8-2
  15. 家用计算机做raid有用吗,磁盘阵列是什么?家用有必要磁盘阵列吗
  16. HIVE启动的时候, The server time zone value ‘EDT‘ is unrecognized or represents more than one time zone.
  17. 1.Transformer-Attention is all your need论文详读-PartⅠ(摘要、引言、背景)
  18. 项目2—职员有薪水了
  19. 计算机与智能科学专业大学排名,智能科学与技术专业大学排名 2020全国排行榜...
  20. c++遇到的编译错误

热门文章

  1. cmi编码用c语言实现,CMI编码与解码
  2. 大量的QT控件及示例发放
  3. 网狐棋牌(八) 异步引擎 和 网狐棋牌(九) 服务引擎概览
  4. COM编程之五 动静态链接
  5. 滑动窗口算法学习(一)
  6. 设计模式---组合模式
  7. 程序员计算手机分辨率比例
  8. MySQL 的 bug 必须修复吗?
  9. WebRTC的现状和未来:专访W3C WebRTC Chair Bernard Aboba(上)
  10. 云游戏是大厂的“游戏”之腾讯云云游戏指南