TypeScript Academy · Pelajaran

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.

Pelajaran 2 dari 28 langkah

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.

Gratis untuk memulai

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

  1. Skema zod/valibot + inferensi
  2. Parsing defensif dan amplop galat
← Kembali ke TypeScript Academy