Fastify

错误处理

未捕获的错误容易引起内存泄漏、文件描述符泄漏等生产环境主要的问题。Node 的 Domain 模块被设计用来解决这一问题,然而效果不佳。事实上,以合理的方式来处理所有未捕获的错误是不可能的,目前,最好的方法就是使程序崩溃。当使用 promise 时,请注意正确地处理了错误。

Fastify 遵循不全则无的原则,旨在精而优。因此,确保正确处理错误成了开发者要考虑的问题。由于大部分的错误源于预期外的输入,我们建议为输入的数据指明 JSON.schema 验证

要注意的是,在基于回调的路由中,Fastify 不会帮你捕获错误。因此,任何未捕获的错误都可能造成崩溃。 但当路由被声明为 async 模式时,错误会被 promise 安全地捕获,并通过 Fastify 默认的错误处理器以一般的 Internal Server Error 响应发送给客户端。要自定义这一行为,请看 setErrorHandler

Fastify 错误代码

FST_ERR_BAD_URL

无效的 url。

FST_ERR_CTP_ALREADY_PRESENT

该 content type 的解析器已经被注册。

FST_ERR_CTP_INVALID_TYPE

Content-Type 应为一个字符串。

FST_ERR_CTP_EMPTY_TYPE

content type 不能是一个空字符串。

FST_ERR_CTP_INVALID_HANDLER

该 content type 接收的处理函数无效。

FST_ERR_CTP_INVALID_PARSE_TYPE

提供的待解析类型不支持。只支持 stringbuffer

FST_ERR_CTP_BODY_TOO_LARGE

请求 body 大小超过限制。

FST_ERR_CTP_INVALID_MEDIA_TYPE

收到的 media type 不支持 (例如,不存在合适的 Content-Type 解析器)。

FST_ERR_CTP_INVALID_CONTENT_LENGTH

请求 body 大小与 Content-Length 不一致。

FST_ERR_DEC_ALREADY_PRESENT

已存在同名的装饰器。

FST_ERR_DEC_MISSING_DEPENDENCY

缺失依赖导致装饰器无法注册。

FST_ERR_HOOK_INVALID_TYPE

钩子名称必须为字符串。

FST_ERR_HOOK_INVALID_HANDLER

钩子的回调必须为函数。

FST_ERR_LOG_INVALID_DESTINATION

日志工具目标地址无效。仅接受 'stream''file' 作为目标地址。

FST_ERR_REP_ALREADY_SENT

响应已发送。

FST_ERR_SEND_INSIDE_ONERR

不能在 onError 钩子中调用 send

FST_ERR_REP_INVALID_PAYLOAD_TYPE

响应 payload 类型无效。只允许 stringBuffer

FST_ERR_SCH_MISSING_ID

提供的 schema 没有 $id 属性。

FST_ERR_SCH_ALREADY_PRESENT

$id 的 schema 已经存在。

FST_ERR_SCH_NOT_PRESENT

不存在 $id 为提供的值的 schema。

FST_ERR_SCH_BUILD

某个路由的 JSON schema 不合法。

FST_ERR_PROMISE_NOT_FULLFILLED

状态码不为 204 时,Promise 的 payload 不能为 ‘undefined’。

FST_ERR_SEND_UNDEFINED_ERR

发生了未定义的错误。