Защитный разбор и оболочки ошибок
Создайте надёжную обработку запросов: выполняйте защитный разбор, преобразуйте все сбои в компактную JSON-оболочку ошибки и не раскрывайте внутренние детали.
«Защитный разбор и оболочки ошибок» — бесплатный урок TypeScript Academy на CoddyKit. Это урок 2 из 2. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения TypeScript Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс TypeScript Academy содержит 2 уроков всего.
Введение
Цель: выполнять разбор защитным способом и всегда возвращать предсказуемый JSON-конверт ошибки. Мы будем держать проверку на границе системы, стандартизировать сбои и сохранять подробные журналы при минимальном содержимом ответов.
- Использование safeParse для всех ненадежных входных данных
- Единообразная структура { ошибка, код, подробности? }
- Разделение правил для 4xx и 5xx
Преобразователь конверта
Определите небольшую многоразовую структуру ErrorEnvelope. Преобразуйте в нее ошибки типа unknown, не раскрывая трассировки стека.
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" } }
}Вспомогательная функция проверки
Оберните схемы во вспомогательную функцию validate, возвращающую результат с различаемыми вариантами. Обработчики останутся небольшими и единообразными.
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> }
}Защитный обработчик
Проверяйте данные заранее и возвращайте 400 с подробностями о проблемах. Неожиданные сбои передавайте в промежуточный обработчик ошибок, который возвращает 500 с конвертом.
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)
}Распространенные конверты
Предоставьте небольшие вспомогательные функции для распространенных результатов: 404/401 со стабильными строками code, чтобы клиенты могли надежно выбирать дальнейшее действие.
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" } }
}Журналы и ответ
Сопоставляйте подробность журналов и ответа: записывайте полную информацию об ошибке на сервере (стек вызовов, идентификатор запроса, идентификатор пользователя), но возвращайте клиенту минимальный конверт. Учитывайте ограничения частоты запросов и редактирование PII.
Проверка формата конверта
Быстрая проверка: как следует возвращать ошибки проверки?
Итоги
Итоги: проверяйте входные данные с помощью safeParse, преобразуйте сбои в компактный конверт и отделяйте подробные журналы от минимальных ответов клиенту.
Часто задаваемые вопросы
Урок «Защитный разбор и оболочки ошибок» бесплатный?
Да — полный текст урока «Защитный разбор и оболочки ошибок» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс TypeScript Academy, подпишись на CoddyKit PRO. Курс TypeScript Academy содержит 2 уроков всего.
Чему я научусь в уроке «Защитный разбор и оболочки ошибок»?
Создайте надёжную обработку запросов: выполняйте защитный разбор, преобразуйте все сбои в компактную JSON-оболочку ошибки и не раскрывайте внутренние детали. Ты практикуешь TypeScript Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать TypeScript Academy?
Предыдущий опыт не требуется. TypeScript Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 2.
Сколько времени занимает урок «Защитный разбор и оболочки ошибок»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке TypeScript Academy?
Да. Каждый урок TypeScript Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Схемы zod/valibot и выведение типов
- Защитный разбор и оболочки ошибок