В экспресс-приложении я использую шаблон MVC. В моем контроллере я вызываю точку входа метода в свою модель (которая в данном случае представляет собой небольшой сервисный класс, который получает DAO), которая также включает свой собственный блок try catch для учета либо ошибки подключения к базе данных, либо ошибки, в которой нет пользователя. находится в базе данных. Если перед этим процессом в промежуточном программном обеспечении предыдущего запуска возникают какие-либо ошибки проверки, я устраняю ошибку внутри контроллера. Сам контроллер представляет собой специальную функцию промежуточного программного обеспечения, которая обрабатывает бизнес-логику, когда пользователь-администратор хочет войти в систему.
exports.login = async (req, res, next) => {
try {
const errors = validationResult(req);
if (!errors.isEmpty()) {
const error = new ValidationError(422,'validation error', errors);
throw error;
}
const loginService = new LoginService(AdminDAO, req.body.username, req.body.password);
const userId = await loginService.authenticateUser();
req.session.adminUserId = userId; // this is only run if an error is not thrown either in my service class or DAO when calling this method
res.redirect("/admin");
} catch (e) {
return next(e);
}
};
Промежуточное программное обеспечение обработки ошибок проверяет тип ошибки и на основе ошибки отправляет ответ обратно клиенту. Я делаю это, либо запуская оператор if else для проверки типа ошибки, либо сохраняя объекты ошибок в массиве и извлекая тот, который соответствует типу, или тот, который соответствует экземпляру класса Error, придерживаясь принципа открытости/закрытости, используя стратегию введите шаблон с полиморфным методом для возврата ответа.
Однако я не вижу в этом преимуществ. Почему бы мне просто не создать полиморфный метод с именем что-то вроде handleError(res) в каждом классе Error, который обрабатывает ошибку и отправляет ответ, а затем вызвать его в моем блоке catch вместо передачи объекта в next(), чтобы он затем имел обработать ответ, выполнив то же самое, что я мог бы сделать в классе Error, прежде чем вызывать следующий вызов? Вот так:
exports.login = async (req, res, next) => {
try {
const errors = validationResult(req);
if (!errors.isEmpty()) {
const error = new ValidationError(422,'validation error', errors);
throw error;
}
const loginService = new LoginService(AdminDAO, req.body.username, req.body.password);
const userId = await loginService.authenticateUser();
req.session.adminUserId = userId; // this is only run if an error is not thrown either in my service class or DAO when calling this method
res.redirect("/admin");
} catch (e) {
return e.handleError(res) // this method returns the error to the client
}
};
Подробнее здесь: https://stackoverflow.com/questions/793 ... xpress-app