Единый формат ошибок
Часть раздела 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');Задание
Легко- Напиши
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);
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.