У меня есть массив идентификаторов документов, которые я хочу удалить с помощью облачной функции, мой код выглядит следующим образом:
//If the user decieds on deleting his account forever we need to make sure we wont have any thing left inside of db after this !!
// incoming payload array of 3 docs
data = {array : ['a302-5e9c8ae97b3b','92c8d309-090d','a302-5e932c8ae97b3b']}
export const deleteClients = functions.https.onCall(async (data, context) => {
try {
// declare batch
const batch = db.batch();
// set
data.arr.forEach((doc: string) => {
batch.delete(db.collection('Data'), doc);
});
// commit
await batch.commit();
} catch (e) {
console.info(e);
}
return null;
});


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Удалить принимает один параметр, ссылку на документ, который нужно удалить.
data.arr.forEach((docId: string) => {
batch.delete(doc(db, "Data", docId));
});
к сожалению, я получаю, что документ deleteClients не является функцией.
В вашем коде есть несколько ошибок:
data.arr.forEach() не может работать, потому что ваш объект данных содержит один элемент с ключом array, а не с ключом arr.return null; ПОСЛЕ блока try/catch: это означает, что в большинстве случаев ваша облачная функция будет завершена до завершения асинхронной работы (см. ссылку выше)Итак, следующее должно помочь (непроверено):
const db = admin.firestore();
const data = {array : ['a302-5e9c8ae97b3b','92c8d309-090d','a302-5e932c8ae97b3b']};
export const deleteClients = functions.https.onCall(async (data, context) => {
try {
const batch = db.batch();
const parentCollection = db.collection('Data')
data.array.forEach((docId) => {
batch.delete(parentCollection.doc(docId));
});
// commit
await batch.commit();
return {result: 'success'} // IMPORTANT, see explanations above
} catch (e) {
console.info(e);
// IMPORTANT See https://firebase.google.com/docs/functions/callable#handle_errors
}
});
спасибо за отличное объяснение. Я работал только с интерфейсным SDK. Мне нужно больше узнать, теперь это имеет больше смысла.
есть еще небольшой вопрос, а что если пакет.delete(parentCollection.doc(docId)); ошибки, но мы возвращаем {result: 'success'} до этого улова? не даст ли он в этом случае ложного срабатывания? должен ли успех возврата быть после улова, подтверждающего, что все прошло нормально?
Если в пакете есть одна ошибка, она будет перехвачена блоком catch. «Должен ли возвратный успех быть после улова, подтверждающего, что все прошло нормально?» => Абсолютно нет! Это завершит облачную функцию, см. документ, указанный в ответе.
Здравствуйте, не могли бы вы поделиться своим контентом
package.json, а также тем, как вы определяете переменнуюdb.