koa文档

简介

koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。

koa1.x的用generator, koa2.x用async/await, node各个版本对es6的支持程度,可参考 node.green

Koa 应用是一个包含一系列中间件 generator 函数的对象。 这些中间件函数基于 request 请求以一个类似于栈的结构组成并依次执行。 Koa 类似于其他中间件系统(比如 Ruby's Rack 、Connect 等), 然而 Koa 的核心设计思路是为中间件层提供高级语法糖封装,以增强其互用性和健壮性,并使得编写中间件变得相当有趣。

Koa 包含了像 content-negotiation(内容协商)、cache freshness(缓存刷新)、proxy support(代理支持)和 redirection(重定向)等常用任务方法。 与提供庞大的函数支持不同,Koa只包含很小的一部分,因为Koa并不绑定任何中间件。

hello world示例:

  1. //koa 2.x
  2. var Koa = require('koa');
  3. var app = new Koa();
  4. app.use(async (ctx, next) => {
  5. ctx.body = 'Hello World';
  6. });
  7. app.listen(3000);
  8. console.log('server listening at 3000');

中间件

Koa 的中间件通过一种更加传统(您也许会很熟悉)的方式进行级联,摒弃了以往 node 频繁的回调函数造成的复杂代码逻辑。 我们通过 generators 来实现“真正”的中间件。 Connect 简单地将控制权交给一系列函数来处理,直到函数返回。 与之不同,当执行到 yield next 语句时,Koa 暂停了该中间件,继续执行下一个符合请求的中间件('downstrem'),然后控制权再逐级返回给上层中间件('upstream')。

koa1.x 和 koa2.x的中间件机制是一样的,区别在于koa1.x用generator书写,koa2.x用async/await; async/await本质上是generator的语法糖,generator的本质是一个迭代器,需要runner去触发下一阶段的执行.

中间件的栈执行顺序(后进先出),类似html标签层层嵌套,从顶层到底层,在从底层开始闭合(其实dom的事件机制也类似)

示例:

  1. //> koa 2.x
  2. var Koa = require('koa');
  3. var app = new Koa();
  4. // mw: x-response-time
  5. app.use(async (ctx,next) => {
  6. let start = new Date;
  7. await next();
  8. let ms = new Date - start;
  9. ctx.set('X-Response-time', ms + 'ms');
  10. });
  11. // mw: logger
  12. app.use(async (ctx, next) => {
  13. let start = new Date;
  14. await next();
  15. let ms = new Date - start;
  16. console.log('%s %s - %d', ctx.method, ctx.url, ms);
  17. });
  18. // mw: response
  19. app.use(async (ctx, next) => {
  20. ctx.body = 'Hello World'; // 设置响应内容后,还可以 ctx.se(..) 设置响应头
  21. });
  22. app.listen(3012);
  23. console.log('server listening at 3012');
  24. //> koa 1.x
  25. var koa = require('koa');
  26. var app = koa();
  27. // x-response-time
  28. app.use(function* (next) {
  29. let start = new Date;
  30. yield next;
  31. var ms = new Date - start;
  32. this.set('X-Response-Time', ms + 'ms');
  33. });
  34. // logger
  35. app.use(function* (next) {
  36. let start = new Date;
  37. yield next;
  38. let ms = new Date - start;
  39. console.log('%s %s - %d', this.method, this.url, ms);
  40. });
  41. // response
  42. app.use(function* (next) {
  43. this.body = 'Hello World~~';
  44. });
  45. app.listen(3012);
  46. console.log('server listen at 3012');

配置

app实例的配置属性:

  • app.name 应用名称
  • app.env 环境变量(默认为 process.env.NODE_ENV || 'development')
  • app.proxy 若为true, 则解析header(请求头),并支持 X-Forwarded-Host
  • app.subdomainOffset 默认2,表示 app.subdomains, 所忽略的segment个数

app.listen(port)

app.listen(3000) 创建并返回一个http服务器.

  1. // app.listen() 同下
  2. var http = require('http');
  3. http.createServer(app.callback()).listen(3000);
  4. http.createServer(app.callback()).listen(3001); // 同一个应用运行在多个端口上

app.callback()

app.callback() 返回request callback函数,可用于 http.createServer(app.callback())

app.use(middleware)

app.use(mw) 为应用添加中间件

app.keys

app.keys = ['i am secrect', 'hello'] 设置 signed cookie 的密钥

ctx.cookies.set('name', 'sandy', {signed: true}) 设置加密的cookie

错误处理

默认所有的错误信息会输出到 stderr, 可以监听error事件,实现自动的错误处理.

  1. app.on('error', function(err, context) {
  2. // 若处理请求阶段出错,不能响应时,会有context参数传入回调
  3. console.error('server error:', err);
  4. });

上下文对象

Koa Context 将 node 的 request 和 response 对象封装在一个单独的对象里面,其为编写 web 应用和 API 提供了很多有用的方法。

context 在每个 request 请求中被创建.

koa 1.x 的上下文对象为中间件的 this, koa 2.x 的上下文对象,为中间件的参数1

  1. // koa 1.x
  2. app.use(function* (next) {
  3. this.body = 'good'; // this is context obj
  4. });
  5. // koa 2.x
  6. app.use(async (ctx, next) => {
  7. ctx.body = 'good2'; // ctx is context obj
  8. });

为了便于访问和调用,许多 context 的属性和方法,代理了 ctx.request 和 ctx.response 所对应的等价方法, 比如说 ctx.type 和 ctx.length 代理了 response 对象中对应的方法,ctx.path 和 ctx.method 代理了 request 对象中对应的方法。

  • ctx.req nodejs的request对象

  • ctx.res nodejs的response对象

  • ctx.request koa的request对象, 包装后的nodejs的request对象

  • ctx.response koa的response对象

  • ctx.app 应用实例的引用

  • ctx.cookies.get(name, [options]) 获取coolie, koa使用了Express的cookies模块

  • ctx.cookies.set(name, value, [options]) 设置cookie,

    1. options = {
    2. signed: true,
    3. expires: time,
    4. path: '/',
    5. domain: 'a.com',
    6. secure: false,
    7. httpOnly: true
    8. }
  • ctx.throw(msg, [status]) 抛出异常

    1. // 适配 msg status两个参数的顺序,缺少的则用默认值
    2. ctx.throw(403);
    3. ctx.throw('some error');
    4. ctx.throw('name required', 400);
    5. ctx.throw(400, 'name required');
  • ctx.response ctx.response = false 时,可以通过ctx.res直接使用原生的response对象, 但不推荐这样做

  • ctx.request对象释放到 ctx上的方法和属性

    // url and method

    • ctx.url
    • ctx.originalUrl read only
    • ctx.protocol read only
    • ctx.host read only
    • ctx.hostname read only
    • ctx.path
    • ctx.query
    • ctx.querystring
    • ctx.method

    // header

    • ctx.header read only
    • ctx.get(headerName)
    • ctx.is() 判断 content-type
    • ctx.accepts() accepts content-type
    • ctx.acceptsEncodings()
    • ctx.acceptsLanguage()
    • ctx.accepetsCharsets()

    // others

    • ctx.ip read only
    • ctx.ips read only
    • ctx.secure read only
    • ctx.subdomains read only
    • ctx.fresh read only
    • ctx.stale read only
    • ctx.socket read only
  • ctx.response对象释放到 ctx 上的方法和属性

    // 响应体

    • ctx.body
    • ctx.attachment()

    // 响应头

    • ctx.set(name,val) 设置响应头
    • ctx.remove() 删除响应头
    • ctx.status 状态码
    • ctx.length content-length
    • ctx.type content-type
    • ctx.lastModified 缓存相关响应头
    • ctx.etag

    // 其他

    • ctx.headerSent 是否已发送响应头
    • ctx.redirect() 重定向
  • ctx.request对象的完整属性方法

    // url and method

    • ctx.request.method
    • ctx.request.url
    • ctx.request.originalUrl
    • ctx.request.protocol
    • ctx.request.host hostname:port
    • ctx.request.hostname
    • ctx.request.path
    • ctx.request.query eg: {color: 'blue', size: 'small'} 不支持嵌套对象
    • ctx.request.querystring eg: foo=bar&go=fine
    • ctx.request.search eg: ?foo=bar&go=fine

    // header

    • ctx.request.get()
    • ctx.request.header
    • ctx.request.type content-type eg: image/png
    • ctx.request.length cotent-length
    • ctx.request.charset eg: utf-8
    • ctx.request.is() eg: ctx.is('html'), ctx.is('text/html'), ctx.is('html', 'application/*'), ctx.is('application/json')

    // others

    • ctx.request.fresh 若用(*If-None-Match/ETag, If-Modified-Since/Last-Modified)进行缓存协商,则该属性表示协商结果
    • ctx.request.stale 与 ctx.request.fresh 相反
    • ctx.request.secure
    • ctx.request.ip
    • ctx.request.ips
    • ctx.request.subdomains
    • ctx.request.socket
    • ctx.request.idempotent 请求是否幂等

    // 内容协商

    • ctx.request.accepts(types) eg: ctx.accepts('html') ctx.accepets('json', 'text')
    • ctx.request.acceptsEncoding(encodings) eg: ctx.acceptsEncodings('gzip', 'deflate','identity')
    • ctx.request.acceptsLanguages(langs) eg: this.acceptsLanguages('es', 'en')
    • ctx.request.acceptsCharsets(charsets) eg: ctx.acceptsCharsets('utf-8')
  • ctx.response对象的完整属性

    // 响应体

    • ctx.response.body eg: ctx.body = String/Buffer/Stream/Object
    • ctx.response.attachment([filename])

    // 响应头

    • ctx.response.get(field) eg: ctx.response.get('ETag') 响应头(field)不区分大小写
    • ctx.response.set(field, value) eg: ctx.set('cache-control', 'no-cache')
    • ctx.response.remove(field)
    • ctx.response.append(field, val) 为指定头部追加值
    • ctx.response.header
    • ctx.response.status eg: ctx.response.status = 301;
    • ctx.response.statusString
    • ctx.response.length content-length
    • ctx.response.type content-type eg: image/png , .png , png
    • ctx.response.lastModified eg: ctx.lastModified = new Date()
    • ctx.response.etag eg: ctx.response.etag = crypto.createHash('md5').update(ctx.body).digest('hex');

    // 其他

    • ctx.response.headerSent

    • ctx.response.vary(field) 等价于 ctx.response.append('Vary', field)

    • ctx.response.socket

    • ctx.response.redirect(url, [alt])

      1. ctx.redirect('back');
      2. ctx.redirect('back', '/index.html')
      3. ctx.redirect('/login');
      4. ctx.redirect('http://google.com');

koa文档参考的更多相关文章

  1. MiniGUI文档参考手册 基于v1.6.10文本

    MiniGUI各种功能都分布在预先定义宏对每个文档标题.特别不方便查找,这是不利于初学者学习. 有一天,我发现doxygen,因此,使用该工具可以生成一个minigui参考文献 .基于v1.6.10文 ...

  2. 通过XmlDocument读写Xml文档参考地址

    /// <summary> /// 获取一个报表的参数 http://blog.csdn.net/hdhai9451/article/details/12170069 /// </s ...

  3. koa文档笔记

    请求 get ctx.request.query // 查询对象 ctx.request.querystring // 查询字符串 ctx.query // 查询对象 ctx.querystring ...

  4. rem布局js设置,设置网页文档参考字体闭包函数

    (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ...

  5. FORM实现中打开图片,链接,文档(参考自itpub上一篇帖子,整理而来)

    FORM实现中打开图片,链接,文档 参考自itpub上一篇帖子,整理而来 1.添加PL程序库D2kwutil.pll 2.主要实现程序 /*过程参数说明: v_application --打开文件的应 ...

  6. Nodejs v4.x.0API文档学习(2)Assert断言测试模块

    文档参考地址:https://nodejs.org/dist/latest-v4.x/docs/api/ Assert(断言) assert模块提供了一组简单的断言测试方法,可以拥有测试不变量.该模块 ...

  7. Nodejs v4.x.0API文档学习(1)简介

    文档参考地址:https://nodejs.org/dist/latest-v4.x/docs/api/ 简介 下面是用nodejs编写的一个web服务的例子,返回"Hello World& ...

  8. 制作Net程序的帮助文档--总结

    一.工具的准备 目前,一般采用Sandcastle Help File Builder工具来制作.Net程序帮助文档,该工具主要是利用Xml文档里的信息以及DLL文件来生成完整的帮助文档.在Visua ...

  9. Java 初学者帮助文档以及基础教程

    一下午的时间,大致看了一下Java的文档,进一步熟悉了Java的大体框架和结构,整理了一下有用的资源. 帮助文档: JSE 8 API 英文版 在线HTML格式:http://docs.oracle. ...

随机推荐

  1. 三十分钟学完Vue

    基础知识: vue的生命周期: beforeCreate/created. beforeMount/mounted. beforeUpdate/updated. beforeDestory/desto ...

  2. BZOJ3537 : [Usaco2014 Open]Code Breaking

    考虑容斥,枚举哪些串必然出现,那么贡献为$(-1)^{选中的串数}$. 设$f[i][j]$表示$i$的子树内,$i$点往上是$j$这个串的贡献之和,那么总状态数为$O(n+m)$,用map存储$f$ ...

  3. python系统编程(六)

    threading注意点 1. 线程执行代码的封装 通过上一小节,能够看出,通过使用threading模块能完成多任务的程序开发,为了让每个线程的封装性更完美,所以使用threading模块时,往往会 ...

  4. Yii2 RbacController示例

    RbacController 示例: <?php namespace console\controllers; use Yii; use yii\console\Controller; clas ...

  5. uestc 猛男搜索26题 by qscqesze

    https://vjudge.net/contest/202940#overview 不断更新

  6. GMA Round 1 三视图

    传送门 三视图 该几何体如图所示,是一个边长为$2\sqrt{3}$的正四面体,高是$h=2\sqrt{2}$,内切球半径是$r=\frac{h}{4}=\frac{\sqrt{2}}{2}$,则体积 ...

  7. c# zxing生成二维码和打印

    生成二维码代码 asset=“要生成的字符串”: public static Bitmap CreateQRCode(string asset) { EncodingOptions options = ...

  8. seq_file学习(1)—— single_open

    span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...

  9. SqlAlchemy “Too many connections”

    File "C:\Users\user\AppData\Local\Programs\Python\Python36\lib\site-packages\pymysql\connection ...

  10. laravel实战化项目之三板斧

    laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 laravel是我工作10多年来见到的真正能称得上让phper从面条一样杂乱的代 ...