Skip to content

RFC-7807 for errors #415

Open
Open
@franky47

Description

@franky47

In combination with fastify.sensible, make it easy to send well-formatted errors to clients, with actionable details for better DX.

Specification: https://tools.ietf.org/html/rfc7807

Copy-pasta from another project:

// https://tools.ietf.org/html/rfc7807

import { STATUS_CODES } from 'node:http'
import { z } from 'zod'

export const rfc7807Schema = z.object({
  status: z
    .number()
    .int()
    .refine(code => code in STATUS_CODES),
  type: z.string().url().optional(), // Technically a URI, but let's not split hairs
  title: z.string(),
  detail: z.string().optional(),
  instance: z.string().url().optional()
})

export type RFC7807 = z.TypeOf<typeof rfc7807Schema>

export class RFC7807Error extends Error {
  readonly rfc7807: RFC7807

  constructor(args: RFC7807) {
    super(
      `${STATUS_CODES[args.status]}: ${args.title}${
        args.detail ? ` (${args.detail})` : ''
      }`
    )
    this.name = 'RFC7807Error'
    this.rfc7807 = {
      ...args,
      type: args.type ?? 'about:blank'
    }
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions