Ошибка JavaScript / ускоренная обработка ж/ обещает


Вот и мне интересно, Как правильно обрабатывать ошибки в JavaScript при использовании обещаний. В настоящее время я бросать ошибки на все, так что я могу вырваться из посыла - если я не могу что-то найти, если отсутствует парам, не удалось выполнить операцию, и т. д.

Мне кажется неправильным бросать исключение для всего такого, но это лучшее, что я придумал до сих пор после долгих раздумий. Я уверен, чтобы поймать все мои бросали ошибки в маршрутах, который передает их на моем промежуточного.

Есть ли лучший способ?

// SERVICE / MODEL LOGIC
getUserByEmail() {
  if (!this._model.email) {
    throw new VError('Missing email.');
  }

  return UserModel.findOne({ email: this._model.email }).exec()
    .then((result) => {
      if (!result) {
        throw new VError(errors.NOT_FOUND, 'Could not find user.');
      }

      return result;
    })
    .catch((error) => {
      throw new VError(error, 'Could not find user.');
    });
}

// ROUTE
router.get('/users/:email', (req, res, next) => {
  const model = new UserModel({ email: req.params.email });

  res.setHeader('Content-Type', 'application/json');
  return new UserService(model).getUserByEmail()
    .then(result => res.status(200).send(result))
    .catch(error => next(error));
});

// MIDDLEWARE
const errorHandling = (error, req, res, next) => 
  res.status(VError.info(error).status || 500).send(error.message);



294
0
задан 2 февраля 2018 в 05:02 Источник Поделиться
Комментарии
1 ответ

Здесь большая проблема. getUserByEmail() можем либо вернуть обещание или кидать синхронно, что это плохой дизайн и очень недружелюбно для звонящего. Вместо этого, вы хотите, чтобы любой синхронные ошибки должны быть возвращены как отверженный обещание.

Начале ваш код должен быть изменен от этого:

// SERVICE / MODEL LOGIC
getUserByEmail() {
if (!this._model.email) {
throw new VError('Missing email.');
}

к этому:

// SERVICE / MODEL LOGIC
getUserByEmail() {
if (!this._model.email) {
return Promise.reject(new VError('Missing email.'));
}

Другие throw заявления, что вы делаете с .then() обработчик в свою очередь обещают цепочку в отверженный обещание. Вы могли бы также делать return Promise.reject(...)но throw работает так же хорошо.

4
ответ дан 2 февраля 2018 в 05:02 Источник Поделиться