Почему блок catch() не запускается в запросах Objection.js, а вместо этого всегда запускается then(), передавая в результате либо 0, либо 1?

Поэтому при выполнении запроса с использованием Objection.js запрос будет возвращать данные в зависимости от успеха или неудачи указанного запроса, и эти данные передаются в блок then() как 0 или 1. Для обработки ошибок мне нужно проверять ложные значения, а не отправлять ответ в блоке catch. Я делаю что-то неправильно?

const editIndustry = async (req, res, next) => {
    const industry = await Industry.query().findById(req.params.industryId);

    if (!industry) {
        return res.status(404).json({
            error: 'NotFoundError',
            message: `industry not found`,
        });
    }
    await industry
        .$query()
        .patch({ ...req.body })
        .then(result => console.info(result, 'then() block'))
        // never runs
        .catch(err => {
            console.info(err);
            next(err);
        });
};
App is listening on port 3000.
1 then() block ran
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
802
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Я думаю, что функция, которую вы действительно ищете, это patchAndFetchById (см. документы). Если вы беспокоитесь о появлении ошибки 404, вы можете добавить throwIfNotFound. Очевидно, что это приведет к броску, если он не будет найден в базе данных, что позволит вам поймать. Вы можете поймать экземпляр этой ошибки, чтобы отправить правильный ответ 404. В противном случае вы хотите вернуть 500. Вам нужно будет потребовать NotFoundError от возражения.

const { NotFoundError } = require('objection');
const Industry = require('<myIndustryModelLocation>');

const editIndustry = (req, res) => {
  try {

    return Industry
        .query()
        .patchAndFetchById(req.params.industryId, { ...req.body })
        .throwIfNotFound();

  } catch (err) {

    if (err instanceof NotFoundError) {
      return res.status(404).json({
        error: 'NotFoundError',
        message: `industry not found`,
      });
    }

    return res.status(500);
  }
};

ОП здесь! Спасибо за помощь, теперь я вижу, моя ошибка заключалась в том, что возвращаемое значение - это строки. Я использовал ваш код, но мне пришлось обновить его с помощью асинхронного ожидания, чтобы он работал, поскольку вызовы асинхронны. Кроме того, мне пришлось использовать $query для ответа, поскольку я использую уникальный модуль проверки, который может выполнять проверку только для $query.

stephano 29.07.2019 21:06

Я понимаю - я не включил async/await, потому что Industry.query() возвращает обещание, что означает, что async/await там не требуется. Если бы вы включили его, это было бы просто оберткой обещания, возвращаемого возражением. Однако, если вы выполняете несколько запросов в своем запросе, вам обязательно нужно использовать async/await. Рад узнать, что ваша проблема решена! Можете ли вы отметить его как решенный?

technogeek1995 29.07.2019 21:10

Да, я думаю, но я не очень понимал это раньше, теперь я понимаю немного больше. И поэтому написал это более разумно для себя. Что вы имеете в виду под «возвращает обещание», разве это все еще не нужно ждать или .then() ? Сейчас разберусь, еще раз спасибо!

stephano 29.07.2019 21:12

Другие вопросы по теме