#javascript #node.js #async-await #try-catch #refactoring
#javascript #node.js #асинхронный-ожидание #попробуйте-поймайте #рефакторинг
Вопрос:
Мне интересно, как наилучшим образом обрабатывать несколько зависимых вызовов API в nodejs с помощью блока try catch. Допустим, мне нужно отправить запрос, дождаться ответа, затем использовать ответ в последующем запросе API на другой сервер и так далее. Сначала я пытался разделить их на несколько блоков try / catch, но затем понял, что если я зависим от ответа, я не могу разделить последующие запросы на части.
Вот пример того, что я имею в виду:
try {
const token = await getAuth0Token();
const userExistsInAuth0 = await doesUserExist({
email,
token
});
if (!userExistsInAuth0) {
return res.status(500).json({
//...
});
}
// Create User
let createUserStatus = await createUser({
//....
});
if (createUserStatus == 'error') {
return res.status(200).json({
//...
});
}
const payment = await stripe.paymentIntents.create({
//...
});
return res.status(200).json({ //Success
//...
});
} catch (error) {
return res.status(500).json({ //Error
//...
});
}
Это рекомендуемый способ сделать это? Я беспокоюсь, что очень скоро все станет очень запутанным, но я не понимаю, как я мог бы все разделить.
Комментарии:
1. мне кажется чистым и читаемым. о чем вы беспокоитесь?
2. @malong11 спасибо! Я думаю, будучи новичком, я немного больше беспокоюсь, чем следовало бы, может быть, что-то пропустить или сделать что-то не так, особенно. поскольку это оплата, и каждый шаг зависит от успеха предыдущего и т. Д.
Ответ №1:
Вы могли бы определять пользовательские классы ошибок и создавать экземпляры этих классов в своих сервисах. Затем вы обрабатываете эти ошибки внутри уже существующего блока catch. Например:
class UserNotFound extends Error { ... }
class CreateUserError extends Error { ... }
// etc.
Затем в вашем блоке catch вы можете использовать instanceof
для определения ошибки:
try {
const token = await getAuth0Token();
// doesUserExist now throws an UserNotFound error if the user does not exist yet
const userExistsInAuth0 = await doesUserExist({
email,
token
});
// Create User
let createUserStatus = await createUser({
//....
});
const payment = await stripe.paymentIntents.create({
//...
});
return res.status(200).json({ //Success
//...
});
} catch (error) {
if (error instance of UserNotFound) { // handle UserNotFound error
} else if(error instance of CreateUserError) { // handle CreateUserError error
} else {
// handle any unhandled error
return res.status(500).json({ //Error
//...
});
}
}