【发布时间】:2022-01-21 09:36:24
【问题描述】:
我有一个寄存器控制器,它使用try {} catch(e) {} 机制对我来说这是一个相当不错的临时错误机制,但总的来说,它更好地切换到承诺,因为我认为承诺提供了更细粒度的错误处理机制,所以下面是我的代码截至目前在我的控制器中。
const registerNewUser = async (req, res) => {
/*
code here for extracting info from req
*/
try {
const users_data = await users.create_new_user({
email,
crypted_pwd,
salt,
first_name,
phone_code,
});
const { id: user_id, first_name: user_first_name } = users_data;
const customer_data = await customers.create_new_customer({
first_name,
last_name,
email,
});
const {
tenant_id,
id: customer_id,
} = customer_data;
await clearCartFromRedis(merchant_canonical_name, req.token);
signUpWelcomeMailer(merchant_canonical_name, req.token, user_id);
return res.status(200).json({
success: true,
access_token: req.token,
first_name: user_first_name,
});
} catch (error) {
logger.log({ message: error.message, level: 'error' });
return res.status(500).send(error.message);
}
};
如您所见,在 try 块中发生了很多事情。 IE。查询到create_new_user 和create_new_customer,然后是clearCartFromRedis,然后是signUpWelcomeMailer。所有这三个都可能引发不同类型的错误,但我已经在一个 catch 块中处理了它们,其中我有以下语句。
return res.status(500).send(error.message);
所以现在我的问题是使用 then() 和 catch() 在承诺链中处理这个问题会更好吗?所以说将上面的内容重构为类似
customers.create_new_customer({
first_name,
last_name,
email,
}).then(data => {
const obj = { tenant_id: data.tenant_id, id: data.customer_id, merchant_canonical_name: data.merchant_canonical_name }
return obj
}).then((obj) => {
clearCartFromRedis()
.catch(() => { throw new Error('Could not clear cache') })
}).then(() => {
signUpWelcomeMailer(merchant_canonical_name, req.token, user_id)
.catch(() => { throw new Error('Error encountered while sending the email') })
}).catch(error => res.sendStatus(500))
因此,您可以看到最后有单独的错误处理以及全局 catch 块。我的问题是在我的用例中是全局try ... catch 更好还是promise 链接机制?
附: HERE 也有类似的问题,但这个问题更多地涉及try .. catch 与promise chaining mechanism。
【问题讨论】:
-
您可以将
.catch()调用(用于细粒度的错误处理)与await语法(用于简单的顺序代码)结合起来,这不是非此即彼的。 -
@Bergi 你的意思是粗略地说在
try ..catch内添加链接,并让全局错误处理由try catch 处理? -
是的——顺便说一句,我昨天刚刚写了an answer demonstrating this。尽管“全局错误处理”可能通常发生在函数之外,但您只需让异常向上传播
-
@Bergi,非常感谢,kidda 有帮助,所以我假设我的第一个代码块(我已经在使用
await)中唯一缺少的是catch部分.另外,当您说let the exceptions propagate upwards时,您的意思是catch 块内的throw Error之类的东西,然后在全局app.use(err => if(error) {return res.sendStatus(500)})中处理错误,我说得对吗?抱歉有点太好奇了:P
标签: javascript node.js error-handling