Несколько зависимых вызовов API в блоке try / catch? (NodeJS)

#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
         //...
       });
      }
    }