TypeScript Academy · Les

Error middleware en Result-typen

Ontwerp een centrale error handler en een getypeerd Result-patroon; omwikkel async-handlers om fouten door te geven; retourneer consistente error envelopes.

Les 3 van 38 stappen

Error middleware en Result-typen is een gratis TypeScript Academy-les op CoddyKit. Dit is les 3 van 3. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject TypeScript Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus TypeScript Academy bevat in totaal 3 lessen.

Inleiding

Doel: centraliseer runtimefouten en retourneer een consistente JSON-‘foutenvelop’. Je maakt een type Result, een asynchrone handler-wrapper en robuuste foutmiddleware.

  • Onderscheiden Result<T,E>
  • next(err) vanuit asynchrone handlers
  • Toewijzing van unknown aan een getypeerde fout

Result-type

Gebruik een onderscheiden unie voor functieresultaten: { ok: true; value } of { ok: false; error }. Aanroepers moeten beide takken afhandelen.

// Result pattern for services and controllers
export type Ok<T> = { ok: true; value: T }
export type Err<E> = { ok: false; error: E }
export type Result<T, E = string> = Ok<T> | Err<E>

export const ok = <T>(value: T): Ok<T> => ({ ok: true, value })
export const err = <E>(error: E): Err<E> => ({ ok: false, error })

// Example usage
async function getUserName(id: string): Promise<Result<string, "NOT_FOUND" | "DB">> {
  if (id === "missing") return err("NOT_FOUND")
  try { return ok("Ada") } catch { return err("DB") }
}

Foutenvelop

Zet unknown om in een kleine, voorspelbare envelop. Laat geen stacktraces uitlekken naar clients.

// Canonical error envelope
export type ErrorEnvelope = {
  error: string
  code?: string
  details?: unknown
}

export function mapError(u: unknown): ErrorEnvelope {
  if (u instanceof Error) return { error: u.message }
  if (typeof u === "string") return { error: u }
  try { return { error: JSON.stringify(u) } } catch { return { error: "Unknown error" } }
}

Asynchrone wrapper en middleware

Omwikkel elke async-handler zodat afwijzingen next(err) aanroepen. De uiteindelijke foutmiddleware formatteert JSON één keer.

import express, { Request, Response, NextFunction } from "express"

export const asyncHandler = <P, ResBody, ReqBody, Query>(fn: (req: Request<P, ResBody, ReqBody, Query>, res: Response<ResBody>, next: NextFunction) => Promise<unknown>) => {
  return (req: Request<P, ResBody, ReqBody, Query>, res: Response<ResBody>, next: NextFunction) => {
    Promise.resolve(fn(req, res, next)).catch(next)
  }
}

export function errorMiddleware(err: unknown, _req: Request, res: Response, _next: NextFunction) {
  const env = mapError(err)
  const status = env.code === "NOT_FOUND" ? 404 : 500
  res.status(status).json(env)
}

// Usage
// app.get("/", asyncHandler(async (req, res) => { throw new Error("boom") }))
// app.use(errorMiddleware)

Routes en integratie

Combineer validatie en foutafhandeling: validatie retourneert 400 met details; andere afwijzingen worden opgevangen door de centrale middleware.

import express from "express"
import { z } from "zod"
import { asyncHandler, errorMiddleware } from "./errors"

const createUserSchema = z.object({ name: z.string().min(1) })

const app = express()
app.use(express.json())

app.post("/users", asyncHandler(async (req, res) => {
  const parsed = createUserSchema.safeParse(req.body)
  if (!parsed.success) {
    res.status(400).json({ error: "Invalid body", details: parsed.error.format() })
    return
  }
  res.status(201).json({ id: "u_1", name: parsed.data.name })
}))

app.use(errorMiddleware)

app.listen(3000, () => console.log("http://localhost:3000"))

Tips

Tips:

  • Registreer details aan de serverzijde; retourneer minimale clientberichten.
  • Gebruik bij voorkeur een getypeerd Result in services en vertaal dit aan de HTTP-rand.
  • Slik afwijzingen nooit in—roep altijd next(err) aan.

Controle op asynchrone fouten

Snelle controle: Welk patroon stuurt asynchrone fouten correct door?

Samenvatting

Samenvatting: Gebruik een Result-unie voor domeinlogica, wikkel asynchrone handlers in zodat ze next aanroepen en formatteer fouten één keer in een laatste middleware.

Gratis beginnen

Leer TypeScript met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
101
Lessen
352

Veelgestelde vragen

Is de les “Error middleware en Result-typen” gratis?

Ja — de volledige tekst van “Error middleware en Result-typen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus TypeScript Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus TypeScript Academy bevat in totaal 3 lessen.

Wat leer ik in “Error middleware en Result-typen”?

Ontwerp een centrale error handler en een getypeerd Result-patroon; omwikkel async-handlers om fouten door te geven; retourneer consistente error envelopes. Je oefent met TypeScript Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met TypeScript Academy te beginnen?

Ervaring vooraf is niet nodig. TypeScript Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 3.

Hoe lang duurt de les “Error middleware en Result-typen”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over TypeScript Academy?

Ja. Elke les over TypeScript Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Router-handlers, typering van Request/Response
  2. Schemavalidatie met zod en inferentie naar TS
  3. Error middleware en Result-typen
← Terug naar TypeScript Academy