NodeJS - Какая проблема с выбрасыванием ошибок как средством управления потоком? - PullRequest
0 голосов
/ 05 января 2019

Этот вопрос похож, но ответы относятся только к парусу: Рекомендации 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);
}

Каковы преимущества / недостатки этого по сравнению с выбрасыванием и отловом ошибок?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...