Этот вопрос похож, но ответы относятся только к парусу: Рекомендации NodeJS: ошибки управления потоком?
Я пришел из фонового уровня, работая над REST API в C #. В C #, когда произошла операционная «ошибка» (я намеренно использую ошибку в кавычках), мы просто возвращали константу или ключ в таблицу поиска сообщений. В зависимости от сообщения, которое было возвращено, уровень маршрутизации возвращает соответствующий код состояния пользователю (200, 404 и т. Д.).
Выполните вход в систему. Учтите, что кто-то входит в систему на сервере, а учетная запись не существует. Это не редкость, поэтому нет смысла выдавать ошибку.
Теперь я пишу Node-приложения, и я разочарован. Кажется, что обычной практикой является просто выбрасывать ошибки везде, когда происходит что-то неожиданное. Это имеет смысл для таких вещей, как база данных не может получить учетную запись, о которой известно, что она существует, или для обнаружения синтаксических ошибок. Но для чего-то вроде пользователя, вводящего неправильное имя пользователя / пароль, выбрасывание ошибки кажется излишним.
Затем рассмотрим случай, когда у вас есть промежуточное программное обеспечение для отчетов об ошибках. В случае синтаксических ошибок вам может потребоваться записать трассировку стека, когда вы никогда не захотите сделать это для чего-то вроде неправильного пароля. Используя ошибки для потока управления, пользователь, вводящий неверный пароль, может использовать те же ресурсы сервера, что и запись критического исключения базы данных. Вы можете расширить класс Error и включить тип ошибки, но это выглядит небрежно.
Наконец, некоторые решения просто возвращают отклики ExpressJS с кодами состояния, но я не всегда хочу один и тот же код состояния для каждого случая, когда пользователь не найден в базе данных. Возможно, я хочу вернуть 404 для страницы профиля пользователя и 400 для неудачного входа в систему.
Кто-нибудь еще сталкивался с этой проблемой, и если да, то как вы справились с ней (каламбур)?
UPDATE
Вот код, демонстрирующий, как будет выглядеть мое решение.
Я изобрел новый класс под названием Goof
, который похож на ошибку, но используется в ситуациях, когда это вероятный результат. Например, неверные учетные данные будут иметь тип Goof
:
// constants.js.
const WRONG_PASSWORD = 1;
const USERNAME_DOES_NOT_EXIST = 1;
// goof.js.
class Goof {
constructor(message) {
this.message = message;
}
}
// Inside express route.
const username = req.body.username;
const password = req.body.password;
const result = await signInUser(username, password);
if(typeof(result) === Goof) {
if(result.status === constants.WRONG_PASSWORD) {
res.sendStatus(400);
return;
}
if(result.status === constants.USERNAME_DOES_NOT_EXIST) {
res.sendStatus(400)
return;
}
else {
throw new Error('A Goof was returned but not handled properly');
}
} else {
res.json(result);
}
Каковы преимущества / недостатки этого по сравнению с выбрасыванием и отловом ошибок?