Следует отметить, что вы на самом деле определяете функцию вызываемого облака , а не HTTPS one , поскольку вы делаете:
exports.deletePost = functions.https.onCall((data, context) => {..});
Одно из преимуществ функции вызываемого облака через HTTPS, одна из них заключается в том, что она «автоматически десериализует тело запроса и проверяет токены аутентификации».
Таким образом, вы можете просто получить пользователя uid
с помощью context.auth.uid;
.
Теперь, что касается способа "оркестровки" различных вызовов, IMHO, вы должны просто объединить в цепочку различные Обещания, возвращаемые асинхронными методами Firebase (те из Firestore и те из Cloud Storage), следующим образом:
exports.deletePost = functions.https.onCall((data, context) => {
//....
const uid = context.auth.uid;
let number_of_likes;
const type_of_post = data.type_of_post;
const the_post = data.the_post;
const deleteDbEntry = admin_firestore.collection('list_of_' + type_of_post).doc(the_post);
return deleteDbEntry.get()
.then(doc => {
number_of_likes = doc.data().number_of_likes;
const filePath = type_of_post + '/' + uid + '/' + data.stored_image_name;
return storage.bucket('android-f.appspot.com').file(filePath).delete();
})
.then(() => {
const batch = admin.firestore().batch();
batch.delete(deleteDbEntry);
if (number_of_likes > 0) {
const updateUserLikes = admin_firestore.collection("users").doc(uid);
batch.update(updateUserLikes, "likes", FieldValue.increment(-doc.data().number_of_likes));
}
return batch.commit();
}).catch(function (error) {
console.log(error);
throw new functions.https.HttpsError('....', '.....');
});
});
Я не думаю, что использование Promise.all()
принесет какой-либо интерес, в вашем случае, потому что, как объяснено здесь , "если любое из переданных обещаний отклоняется, Promise.all
асинхронно отклоняет со значением отклоненного обещания, независимо от того, разрешены ли другие обещания".
На момент написания не было возможности сгруппировать все эти асинхронные вызовы к различным службам Firebase в одну операцию атома c.
Даже если пакетная запись в конце Atomi c, может случиться так, что файл в облачном хранилище будет правильно удален, но пакетная запись в Firestore не будет выполнена, например, из-за проблемы со службой Firestore.
Также обратите внимание, что вам нужен только один обработчик исключений в конце цепочки Promise. Если вы хотите разграничить причину исключения, таким образом, чтобы вы отправили другое сообщение об ошибке внешнему интерфейсу, вы могли бы использовать подход, представленный в этой статье .
. В статье показано, как определить различные пользовательские классы ошибок (производные от стандартного встроенного объекта Error), которые используются для проверки типа ошибки в обработчике исключений.