gpt4 book ai didi

javascript - 在异步等待中捕获错误

转载 作者:行者123 更新时间:2023-12-01 17:16:58 25 4
gpt4 key购买 nike

我有以下功能:

exports.signup = async(req, res) => {
console.log('signup');
const user = new User({
username: req.body.username,
email: req.body.email,
password: bcrypt.hashSync(req.body.password, 8)
});

try {
if (await user.save()) {
if (isNonEmptyArray(req.body.roles)) {
// How do I catch this error? can be a role error or db error
const roles = await Role.find({name: { $in: req.body.roles }}).exec()
user.roles = roles.map(role => role._id);
if (await user.save()) {
success(res, 'Registered!');
}
} else {
// How do I catch this error? can be a role error or a db error
const role = await Role.findOne({name: 'user'}).exec();
user.roles = [role._id];
if (await user.save()) {
success(res, 'Registered!');
}
}
}
} catch(error) {
fail(res, {message: 'Database internal error occured.'});
}
};

捕获将触发 block 中的所有错误是否正确,包括调用 await Role.find({name: { $in: req.body.roles }}).exec()?我将如何独立捕获此错误?我是否需要在 trycatch 语句中添加 trycatch

最佳答案

就像你说的,你可以使用另一个 try-catch block 来区分你捕获的是哪个错误。

try {
const role = await Role.findOne({name: 'user'}).exec();
} catch(err) {
console.log(err);
}

另一个想法可能是使用 promise 并在每个 .catch 段中捕获错误,例如

var query = Role.findOne({name: 'user'});
query.exec().then(function () {
// handle success
}).catch(function (err) {
// handle error
});

无论如何,在使用 async/await 和 try-catch block 时要牢记一些重要的特性,如果您有兴趣,我会把一篇文章的结论和指向它的链接放在这里:

结论:

我们可以使用 try...catch 同步代码。

我们可以使用 try...catch(结合异步函数)和 .catch() 方法来处理异步代码的错误。

在 try block 中返回 promise 时,如果您希望 try...catch block 捕获错误,请确保等待它。

当包装错误并重新抛出时请注意,您会丢失带有错误来源的堆栈跟踪。

字体:https://itnext.io/error-handling-with-async-await-in-js-26c3f20bc06a

关于javascript - 在异步等待中捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62043192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com