Koa 中依赖的库 statuses

383 阅读3分钟

「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

本文为 koa 依赖系列文章,前几篇也可以在站内查看:

statuses 是用来处理状态码信息的,它可以把状态码转为文本,也可以把文本转为状态码,同时内部封装了常见状态逻辑的判断能力。这个库在 koa 中使用的位置比较多,但是功能很简单,这里直接看源码。

statuses 默认导出的是 status 函数,这个函数有两个作用,传入字符串会把字符串转化为状态码,传入状态码会转为字符串,字符串和状态码的映射关系位于 codes.json 文件中。

codes.json 并不是手动定义的,使用 package.json 下面的 update 命令可以自动生成这个文件。update 中执行了 fetch 和 build 两条命令,相关的脚本都位于 scripts 目录下。

先看 fetch 相关,fetch 包含了 fetch-apache、fetch-iana、fetch-nginx、fetch-node 四个脚本,对应了四个不同的数据源:

这四个地方都有 status code 的标准定义,statuses 会获取四个地方的四种数据源,所有的数据源会进行一个合并处理,最终获得的是一个大而全的 codes.json 文件。

这四个 fetch 脚本中,apache、nginx、node 都是直接拉取对应的 status code 逻辑实现源代码,在源码中使用正则表达式对状态码和状态字符串进行匹配。而 iana 是直接下载了一个 csv 资源,使用 csv 解析库csv-parse 进行数据解析处理,最终生成的四个 json 文件保存在 src 目录下。

build 脚本也很简单,前面已经生成了四个 json 文件,这一步会一次读取并保存在 codes 对象上,由于读取存在先后顺序,对于相同的状态码后面的状态字符串定义会覆盖前面的,先后的读取顺序为 iana,node,nginx,apache。最后把 codes 写入到 codes.json 文件中,在 index.js 中就可以使用状态码定义数据了。

'use strict'

var path = require('path')
var write = require('./lib/write')

// all codes
var codes = {}

// initialize with all IANA codes
addData(codes, require('../src/iana.json'))

// add the codes from node
addData(codes, require('../src/node.json'))

// add the codes from nginx
addData(codes, require('../src/nginx.json'))

// add the codes from apache
addData(codes, require('../src/apache.json'))

// write the JSON object
write(path.join(__dirname, '../codes.json'), codes)

function addData (db, obj) {
  Object.keys(obj).forEach(function (key) {
    db[key] = db[key] || obj[key]
  })
}

除了默认的导出外,statuses 库还导出了原始的数据源信息,包含对象和数组多种格式。此外对于重定向、空、重试等特殊状态码,statuses 提供了相应的导出集合,方便使用。

// status codes for redirects
status.redirect = {
  300: true,
  301: true,
  302: true,
  303: true,
  305: true,
  307: true,
  308: true
}

// status codes for empty bodies
status.empty = {
  204: true,
  205: true,
  304: true
}

// status codes for when you should retry the request
status.retry = {
  502: true,
  503: true,
  504: true
}

以上就是 statuses 库的相关内容,在 koa 中有使用到状态码和字符串之间的转换,也会使用 redirect、empty 等做一些状态判断。statuses 库很简短,因此本篇内容也很少,我们可以通过阅读 codes.json 来详细了解感兴趣的 http 状态码。