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.
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.
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
- Router-handlers, typering van Request/Response
- Schemavalidatie met zod en inferentie naar TS
- Error middleware en Result-typen