为什么在 Objection.js 查询中 catch() 块不是 运行 而 then() 总是运行传递 0 或 1 作为结果?
Why is catch() block not running in Objection.js queries and instead then() always runs passing either 0 or 1 as a result?
因此,当 运行 使用 Objection.js 的查询时,查询将 return 基于所述查询成功或失败的数据,并将此数据传递给 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.log(result, 'then() block'))
// never runs
.catch(err => {
console.log(err);
next(err);
});
};
App is listening on port 3000.
1 then() block ran
您的代码按预期工作。它不进入 catch 块的原因是因为没有错误。 patch
没有 return 行。它 returns 更改的行数 (see docs)。
我认为您真正需要的函数是 patchAndFetchById
(see docs)。如果您担心生成 404 错误,可以附加 throwIfNotFound
。显然,如果在数据库中找不到它,这将抛出,这会让你捕捉到。您可以捕获此错误的实例,以便发送正确的 404 响应。否则,您想要 return 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);
}
};
因此,当 运行 使用 Objection.js 的查询时,查询将 return 基于所述查询成功或失败的数据,并将此数据传递给 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.log(result, 'then() block'))
// never runs
.catch(err => {
console.log(err);
next(err);
});
};
App is listening on port 3000.
1 then() block ran
您的代码按预期工作。它不进入 catch 块的原因是因为没有错误。 patch
没有 return 行。它 returns 更改的行数 (see docs)。
我认为您真正需要的函数是 patchAndFetchById
(see docs)。如果您担心生成 404 错误,可以附加 throwIfNotFound
。显然,如果在数据库中找不到它,这将抛出,这会让你捕捉到。您可以捕获此错误的实例,以便发送正确的 404 响应。否则,您想要 return 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);
}
};