Поэтому при выполнении запроса с использованием 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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваш код работает так, как ожидалось. Причина, по которой он не попадает в блок 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);
}
};
Я понимаю - я не включил async/await, потому что Industry.query() возвращает обещание, что означает, что async/await там не требуется. Если бы вы включили его, это было бы просто оберткой обещания, возвращаемого возражением. Однако, если вы выполняете несколько запросов в своем запросе, вам обязательно нужно использовать async/await. Рад узнать, что ваша проблема решена! Можете ли вы отметить его как решенный?
Да, я думаю, но я не очень понимал это раньше, теперь я понимаю немного больше. И поэтому написал это более разумно для себя. Что вы имеете в виду под «возвращает обещание», разве это все еще не нужно ждать или .then() ? Сейчас разберусь, еще раз спасибо!
ОП здесь! Спасибо за помощь, теперь я вижу, моя ошибка заключалась в том, что возвращаемое значение - это строки. Я использовал ваш код, но мне пришлось обновить его с помощью асинхронного ожидания, чтобы он работал, поскольку вызовы асинхронны. Кроме того, мне пришлось использовать $query для ответа, поскольку я использую уникальный модуль проверки, который может выполнять проверку только для $query.