Skip to main content

@keq-request/exception

用于抛出/捕获异常的 Middleware。并且可控制抛出的异常是否触发 retry

安装

使用方法

import { request } from "keq"
import {
  throwException,
  catchException,
  RequestException,
} from "keq-exception"

request
  .use(
    catchException((err) => {
      if (err instanceof RequestException && err.code === 401) {
        context.redirect("/login")
        return
      }

      throw err
    })
  )

  // throwException 的回调函数必然在`await next()`后运行
  // 可以在回调函数中尝试获取 Response
  .use(
    throwException(async (ctx) => {
      if (ctx.response && ctx.response.status >= 400) {
        const body = await ctx.response.json()
        throw new RequestException(ctx.response.status, body.message)
      }
    })
  )

RequestException(statusCode[, errorMessage[, retry]])

参数默认值描述
statusCode-错误码
message''错误信息
retrytrue异常是否会触发retry

Middleware

validateStatusCode

验证 Responsestatus,并抛出对应的 RequestException

  • status200-399 范围内时,不抛出异常
  • status = 400 时,抛出 BadRequestException(statusText)
  • status = 401 时,抛出 UnauthorizedException(statusText)
  • status = 403 时,抛出 ForbiddenException(statusText)
  • status = 404 时,抛出 NotFoundException(statusText)
  • status = 405 时,抛出 MethodNotAllowedException(statusText)
  • status = 406 时,抛出 NotAcceptableException(statusText)
  • status = 407 时,抛出 ProxyAuthenticationRequiredException(statusText)
  • status = 408 时,抛出 RequestTimeoutException(statusText)
  • status = 409 时,抛出 ConflictException(statusText)
  • status = 412 时,抛出 PreconditionFailedException(statusText)
  • status = 413 时,抛出 ContentTooLargeException(statusText)
  • status = 414 时,抛出 UriTooLongException(statusText)
  • status = 415 时,抛出 UnsupportedMediaTypeException(statusText)
  • status = 418 时,抛出 ImATeapotException(statusText)
  • status = 429 时,抛出 TooManyRequestsException(statusText)
  • status 为其他 400-499 的数值时,抛出 RequestException(status, statusText, false)
  • status = 500 时,抛出 `InternalServerErrorException(statusText
  • status = 501 时,抛出 NotImplementedException(statusText)
  • status = 502 时,抛出 BadGatewayException(statusText)
  • status = 503 时,抛出 ServiceUnavailableException(statusText)
  • status = 504 时,抛出 GatewayTimeoutException(statusText)
  • status 为其他 500-599 的数值时,抛出 RequestException(status, statusText, true)

示例

import { request } from "keq"
import { validateStatusCode } from "@keq-request/exception"

request.use(validateStatusCode())

Plugin

ValidateStatusCode

用于 @keq-request/cli 的 Plugin,其主要功能有:

  1. 删除 openapi / swagger 文档中的异常响应定义
  2. 添加 validateStatusCode Middleware

Options

参数是否必填类型默认值描述
modulesstring[]undefined生效的 module 名称列表

示例

.keqrc.ts
import { DefineKeqConfig } from "@keq-request/cli"
import { ValidateStatusCode } from "@keq-request/exception/plugins"

const config: DefineKeqConfig = {
  // ...
  plugins: [
    new ValidateStatusCode(/* { modules: [...] } */)
  ],
}