Menu
CoddyTech

Единый формат ошибок

Часть раздела REST API путешествия по Node.js на Coddy. Урок 8 из 18.

Теперь ваш API возвращает ошибки в двух форматах: строку для 404 и объект zod для 400. Клиент должен обрабатывать каждый из них. Выберите один формат для каждой ошибки:

{ "error": { "code": "not_found", "message": "Invoice not found" } }

{ "error": { "code": "invalid_body", "message": "Too small: ...",
             "fields": { "amount": ["Too small: expected number to be >0"] } } }

code предназначен для программ: он никогда не меняется, поэтому клиент может сравнивать его. message предназначен для людей, и его формулировка может измениться. fields указывает форме, какое поле ввода отметить. Опишите формат в одной функции и вызывайте её из каждого маршрута, чтобы форматы в разных маршрутах не расходились:

sendError(res, 404, 'not_found', 'Invoice not found');
challenge icon

Задание

Легко
  • Напиши sendError в errors.js: { "error": { "code", "message" } } со статусом и fields только при наличии.
  • Используй его для каждого ответа 404 (код not_found), sendInvalid — для каждого некорректного тела запроса, а sendError — в обработчике ошибок в server.js (invalid_json, server_error).

Отправь DELETE /api/tasks/99, затем POST с { "title": 123 }.

Попробуйте сами

import { z } from 'zod';

// Отправляет все ошибки в едином формате:
// { "error": { "code": "not_found", "message": "Task not found" } }
// с "fields", добавляемым только тогда, когда оно передано.
export const sendError = (res, status, code, message, fields) => {
    // Отправьте ответ здесь
};

// Ошибка zod с кодом 400: первая проблема используется как сообщение, а проблемы каждого поля
// помещаются в fields.
export const sendInvalid = (res, zodError) =>
    sendError(res, 400, 'invalid_body', zodError.issues[0].message, z.flattenError(zodError).fieldErrors);
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела REST API