TypeScript Academy · Pelajaran

Perisian tengah ralat dan jenis hasil

Reka pengendali ralat pusat dan corak Result yang ditaip; balut pengendali async untuk meneruskan ralat; pulangkan sampul ralat yang konsisten.

Pelajaran 3 daripada 38 langkah

Perisian tengah ralat dan jenis hasil ialah pelajaran TypeScript Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 3. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran TypeScript Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus TypeScript Academy merangkumi sejumlah 3 pelajaran.

Pengenalan

Matlamat: Pusatkan ralat masa jalan dan kembalikan sampul ralat JSON yang konsisten. Anda akan mencipta jenis Hasil, pembalut pengendali tak segerak, dan perisian tengah ralat yang kukuh.

  • Hasil terbeza<T,E>
  • next(err) daripada pengendali tak segerak
  • Pemetaan tidak diketahui→ralat bertip

Jenis hasil

Gunakan kesatuan terbeza untuk hasil fungsi: { ok: true; value } atau { ok: false; error }. Pemanggil mesti mengendalikan kedua-dua 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") }
}

Sampul ralat

Normalkan yang tidak diketahui menjadi sampul kecil yang boleh diramal. Elakkan membocorkan jejak tindanan 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" } }
}

Pembalut tak segerak dan perisian tengah

Balut mana-mana pengendali tak segerak supaya penolakan memanggil next(err). Perisian tengah ralat terakhir memformat JSON sekali.

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)

Laluan dan integrasi

Gabungkan pengesahan dan pengendalian ralat: pengesahan mengembalikan 400 bersama butiran; penolakan lain ditangkap oleh perisian 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"))

Petua

Petua:

  • Catat butiran di pihak pelayan; kembalikan mesej minimum kepada klien.
  • Utamakan Hasil bertip dalam perkhidmatan dan petakan kepada HTTP di sempadan.
  • Jangan telan penolakan—sentiasa panggil next(err).

Semakan ralat tak segerak

Semakan pantas: Corak manakah yang memajukan ralat tak segerak dengan betul?

Ulang kaji

Ulang kaji: Gunakan kesatuan Hasil untuk logik domain, balut pengendali tak segerak supaya memanggil next, dan formatkan ralat sekali dalam perisian tengah terakhir.

Percuma untuk bermula

Pelajari TypeScript dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
101
Pelajaran
352

Soalan Lazim

Adakah pelajaran “Perisian tengah ralat dan jenis hasil” percuma?

Ya — teks penuh “Perisian tengah ralat dan jenis hasil” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus TypeScript Academy, tingkat taraf kepada CoddyKit PRO. Kursus TypeScript Academy merangkumi sejumlah 3 pelajaran.

Apakah yang akan saya pelajari dalam “Perisian tengah ralat dan jenis hasil”?

Reka pengendali ralat pusat dan corak Result yang ditaip; balut pengendali async untuk meneruskan ralat; pulangkan sampul ralat yang konsisten. Anda berlatih TypeScript Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan TypeScript Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran TypeScript Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 3.

Berapa lamakah pelajaran “Perisian tengah ralat dan jenis hasil” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran TypeScript Academy ini?

Ya. Setiap pelajaran TypeScript Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pengendali penghala, penaipan Request/Response
  2. Pengesahan skema dengan zod dan inferens ke TS
  3. Perisian tengah ralat dan jenis hasil
← Kembali ke TypeScript Academy