「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」
本文为 koa 依赖系列文章,前几篇也可以在站内查看:
- koa 中依赖的库 parseurl
- Koa 依赖的库 type-is 和 content-disposition
- Koa 依赖的库 accepts、content-type 和 cache-content-type
- Koa 依赖的库 encodeurl 和 escape-html
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 状态码。