Код ниже работает как ожидалось. Если вызывается функция начисления, функция извлекает соответствующий объект заявки из firestore
и затем возвращает его обратно клиенту.
Если тикет не существует, функция выдает HttpsError
с сообщением об ошибке, которое будет проанализировано клиентом.
exports.charge = functions.https.onCall(data => {
return admin.firestore().collection('tickets').doc(data.ticketId.toString()).get()
.then((snapshot) => {
return { ticket: snapshot.data() }
})
.catch((err) => {
throw new functions.https.HttpsError(
'not-found', // code
'The ticket wasn\'t found in the database'
);
});
});
Проблема возникает после этого. Теперь мне нужно зарядить пользователя с помощью Stripe, который является еще одним асинхронным процессом, который вернет Promise
. Для оплаты требуется информация о ценах, полученная с помощью первого асинхронного метода, поэтому ее необходимо вызывать после получения snapshot
.
exports.charge = functions.https.onCall(data => {
return admin.firestore().collection('tickets').doc(data.ticketId.toString()).get()
.then((snapshot) => {
return stripe.charges.create(charge) // have removed this variable as irrelevant for question
.then(() => {
return { success: true };
})
.catch(() => {
throw new functions.https.HttpsError(
'aborted', // code
'The charge failed'
);
})
})
.catch(() => {
throw new functions.https.HttpsError(
'not-found', // code
'The ticket wasn\'t found in the database'
);
});
});
Моя проблема с отловом ошибок в новом запросе charge
. Кажется, что в случае сбоя зарядки он успешно вызывает первый «прерванный» улов, но затем он передается родительскому улову, и ошибка переопределяется, и приложение видит ошибку «тикет не найден».
Как я могу остановить это? Мне нужно отловить обе ошибки по отдельности и выдать HttpsError
за каждую.