Parsing defensif dan amplop galat
Bangun penanganan permintaan yang tangguh: lakukan parsing secara defensif, petakan semua kegagalan ke amplop galat JSON yang ringkas, dan cegah kebocoran detail internal.
Parsing defensif dan amplop galat adalah pelajaran TypeScript Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 2. 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 2 pelajaran total.
Pengantar
Tujuan: Lakukan parsing secara defensif dan selalu berikan respons dengan amplop error JSON yang dapat diprediksi. Kita akan menjaga validasi tetap dekat batas sistem, menyeragamkan kegagalan, serta membuat log tetap kaya informasi sementara respons tetap minimal.
- safeParse pada semua input yang tidak tepercaya
- { error, code, details? } yang konsisten
- Disiplin 4xx vs 5xx
Pemeta amplop error
Definisikan ErrorEnvelope kecil yang dapat digunakan kembali. Petakan error unknown ke dalamnya tanpa mengekspos jejak tumpukan.
export type ErrorEnvelope = { error: string; code?: string; details?: unknown }
export function toEnvelope(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" } }
}Pembantu validate
Bungkus skema dalam pembantu validate yang mengembalikan hasil terdiskriminasi. Handler tetap kecil dan konsisten.
import { z, type ZodTypeAny } from "zod"
export function validate<T extends ZodTypeAny>(schema: T, value: unknown) {
const r = schema.safeParse(value)
if (!r.success) {
return { ok: false as const, issues: r.error.format() }
}
return { ok: true as const, data: r.data as z.infer<T> }
}Handler defensif
Lakukan validasi lebih awal; kembalikan 400 dengan detail masalah. Kegagalan yang tidak terduga diteruskan ke perantara error sebagai 500 dengan amplop tersebut.
import type { Request, Response, NextFunction } from "express"
import { z } from "zod"
import { validate } from "./validate"
import { toEnvelope, type ErrorEnvelope } from "./envelope"
const bodySchema = z.object({ email: z.string().email(), newsletter: z.boolean().default(false) })
export function subscribe(req: Request, res: Response<{ ok: true } | ErrorEnvelope>, next: NextFunction) {
const r = validate(bodySchema, req.body)
if (!r.ok) return res.status(400).json({ error: "Invalid body", details: r.issues })
try {
// pretend to persist
return res.status(201).json({ ok: true })
} catch (e) {
return next(e)
}
}
export function errorMiddleware(err: unknown, _req: Request, res: Response<ErrorEnvelope>, _next: NextFunction) {
const env = toEnvelope(err)
res.status(500).json(env)
}Amplop umum
Sediakan pembantu kecil untuk hasil umum: 404/401 dengan string code yang stabil agar klien dapat menentukan alur dengan andal.
export function notFound(resource: string): { status: 404; body: { error: string; code: string } } {
return { status: 404, body: { error: `${resource} not found`, code: "NOT_FOUND" } }
}
export function unauthorized(): { status: 401; body: { error: string; code: string } } {
return { status: 401, body: { error: "unauthorized", code: "UNAUTHORIZED" } }
}Log vs respons
Seimbangkan log dan respons: catat seluruh error di sisi server (tumpukan, ID permintaan, ID pengguna), tetapi kembalikan amplop minimal kepada klien. Pertimbangkan pembatasan laju dan penyamaran PII.
Pemeriksaan praktik amplop
Pemeriksaan singkat: Bagaimana error validasi harus dikembalikan?
Ringkasan
Ringkasan: Validasi input dengan safeParse, petakan kegagalan ke amplop ringkas, dan pisahkan log yang kaya informasi dari respons klien yang minimal.
Belajar TypeScript dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 101
- Pelajaran
- 352
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Parsing defensif dan amplop galat” gratis?
Ya — teks lengkap “Parsing defensif dan amplop galat” 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 2 pelajaran total.
Apa yang akan aku pelajari di “Parsing defensif dan amplop galat”?
Bangun penanganan permintaan yang tangguh: lakukan parsing secara defensif, petakan semua kegagalan ke amplop galat JSON yang ringkas, dan cegah kebocoran detail internal. 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 2 dari 2.
Berapa lama pelajaran “Parsing defensif dan amplop galat” 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
- Skema zod/valibot + inferensi
- Parsing defensif dan amplop galat