Проверяет понимание архитектурных подходов к централизованной обработке ошибок и единообразию кода между слоями контроллера, сервиса и репозитория.
В многослойных приложениях ошибки возникают на каждом уровне: репозиторий может получить ошибку соединения с БД, сервис — нарушение бизнес-правила, контроллер — некорректный ввод. Если каждый слой обрабатывает ошибки по-своему, код становится непредсказуемым и дублируется. Решение — определить единую иерархию исключений и правило: каждый слой либо обрабатывает ошибку, либо оборачивает её в понятное для вышестоящего слоя исключение.
Создайте базовый класс ошибки приложения и наследников для разных категорий: валидация, доступ, бизнес-логика, инфраструктура. Это позволяет вышестоящим слоям реагировать на тип ошибки, не зная деталей реализации.
class AppError extends Error {
constructor(message, code, status = 500) {
super(message);
this.code = code;
this.status = status;
}
}
class NotFoundError extends AppError {
constructor(msg) { super(msg, 'NOT_FOUND', 404); }
}
class ValidationError extends AppError {
constructor(msg) { super(msg, 'VALIDATION', 400); }
}В Express это middleware с четырьмя аргументами, в NestJS — ExceptionFilter, в Spring — @ControllerAdvice. Он перехватывает все исключения и формирует единый JSON-ответ.
app.use((err, req, res, next) => {
const status = err.status || 500;
res.status(status).json({
error: {
code: err.code || 'INTERNAL',
message: err.message || 'Unexpected error'
}
});
});Помимо ошибок, стоит унифицировать и успешные ответы: одинаковая структура { data, meta } или { error } упрощает работу клиента. Логирование ошибок также лучше делать в одном месте — в обработчике, а не разбрасывать по слоям.
Итог: применяйте такой подход в любом проекте с более чем одним слоем — он убирает дублирование, упрощает тестирование и делает контракт API предсказуемым для клиентов.
Уровень
Рейтинг:
5
Сложность:
6
Навыки
Node.js
Express
Ключевые слова
Подпишись на Node.js Developer в телеграм