Middleware kesalahan & tipe hasil
Rancang penangan kesalahan terpusat dan pola Result bertipe; bungkus penangan async untuk meneruskan kesalahan; kembalikan amplop kesalahan yang konsisten.
Middleware kesalahan & tipe hasil adalah pelajaran TypeScript Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar TypeScript Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus TypeScript Academy mencakup 3 pelajaran total.
Pendahuluan
Tujuan: Memusatkan kesalahan saat runtime dan mengembalikan “wadah kesalahan” JSON yang konsisten. Anda akan membuat tipe Hasil, pembungkus penangan asinkron, dan perangkat tengah kesalahan yang tangguh.
- Result<T,E> terdiskriminasi
- next(err) dari penangan asinkron
- Pemetaan kesalahan tidak diketahui→bertipe
Tipe Hasil
Gunakan union terdiskriminasi untuk hasil fungsi: { ok: true; value } atau { ok: false; error }. Pemanggil harus menangani kedua cabang.
// 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") }
}Wadah kesalahan
Normalkan nilai tidak diketahui menjadi wadah kecil yang mudah diprediksi. Hindari membocorkan jejak tumpukan kepada klien.
// 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" } }
}Pembungkus asinkron + perangkat tengah
Bungkus setiap penangan asinkron agar penolakan memanggil next(err). Perangkat tengah kesalahan terakhir memformat JSON satu kali.
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)Rute + integrasi
Gabungkan validasi dan penanganan kesalahan: validasi mengembalikan 400 beserta detailnya; penolakan lainnya ditangkap oleh perangkat tengah pusat.
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"))Kiat
Kiat:
- Catat detail di sisi server; kembalikan pesan minimal kepada klien.
- Utamakan Hasil bertipe di layanan dan petakan ke HTTP di titik terluar.
- Jangan pernah mengabaikan penolakan—selalu panggil
next(err).
Pemeriksaan kesalahan asinkron
Pemeriksaan singkat: Pola mana yang meneruskan kesalahan asinkron dengan benar?
Ringkasan
Ringkasan: Gunakan union Hasil untuk logika domain, bungkus penangan asinkron agar memanggil next, dan format kesalahan satu kali dalam perangkat tengah terakhir.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Middleware kesalahan & tipe hasil” gratis?
Ya — teks lengkap “Middleware kesalahan & tipe hasil” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus TypeScript Academy, upgrade ke CoddyKit PRO. Kursus TypeScript Academy mencakup 3 pelajaran total.
Apa yang akan aku pelajari di “Middleware kesalahan & tipe hasil”?
Rancang penangan kesalahan terpusat dan pola Result bertipe; bungkus penangan async untuk meneruskan kesalahan; kembalikan amplop kesalahan yang konsisten. Kamu berlatih TypeScript Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai TypeScript Academy?
Tidak diperlukan pengalaman sebelumnya. TypeScript Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 3.
Berapa lama pelajaran “Middleware kesalahan & tipe hasil” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran TypeScript Academy ini?
Ya. Setiap pelajaran TypeScript Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Penangan rute Router, pengetikan Request/Response
- Validasi skema dengan zod & inferensi ke TS
- Middleware kesalahan & tipe hasil