Мне нужно удалить всю коллекцию с несколькими документами при удалении пользователя, поэтому я решил создать функцию, чтобы она срабатывала всякий раз, когда пользователь был удален.
Ниже приведен код.
Облачные функции (index.js):
exports.onUserDeleted = functions.auth.user().onDelete((user) => {
deleteCollection(admin.firestore(), user.uid, 15);
});
function deleteCollection(db, collectionPath, batchSize) {
var collectionRef = db.collection(collectionPath);
var query = collectionRef.orderBy('__name__').limit(batchSize);
return new Promise((resolve, reject) => {
deleteQueryBatch(db, query, batchSize, resolve, reject);
});
}
function deleteQueryBatch(db, query, batchSize, resolve, reject) {
query.get()
.then((snapshot) => {
// When there are no documents left, we are done
if (snapshot.size === 0) {
return 0;
}
// Delete documents in a batch
var batch = db.batch();
snapshot.docs.forEach((doc) => {
batch.delete(doc.ref);
});
return batch.commit().then(() => {
return snapshot.size;
});
}).then((numDeleted) => {
if (numDeleted === 0) {
resolve();
return;
}
// Recurse on the next process tick, to avoid
// exploding the stack.
process.nextTick(() => {
deleteQueryBatch(db, query, batchSize, resolve, reject);
});
})
.catch(reject);
}
При попытке выполнить команду развертывания firebase --only возникает следующая ошибка:
65:11 предупреждение Функция стрелки ожидаемая не возвращается неизменное значение-возврат
Предупреждение 65:18 Избегайте гнездящихся обещаний обещать/не-гнездовать
69:11 error Каждый then() должен возвращать значение или бросать обещание/всегда-возврат
3 проблемы (1 ошибка, 2 предупреждения)
Что я делаю неправильно?
Как удалить всю коллекцию при удалении пользователя?
Если вы можете опубликовать вышеуказанный код с логикой, которую я должен применить, я буду очень благодарен.
Сделайте следующее:
const db = admin.firestore();
exports.onUserDeleted = functions.auth.user().onDelete((user) => {
const collectionRef = db.collection(user.uid);
var promises = [];
return collectionRef.get()
.then(qs => {
qs.forEach(docSnapshot => {
promises.push(docSnapshot.ref.delete());
});
return Promise.all(promises);
})
.catch(error => {
console.log(error);
return false;
});
});
Как отражено в вашем коде и как указано в документации (см. Выдержку ниже), вы можете удалить документы по пакету, если коллекция очень велика. Я позволил вам адаптировать вышеуказанный код для этого, если вы считаете это необходимым.
Если у вас есть большие коллекции, вы можете удалить документы меньшими партиями, чтобы избежать ошибок в памяти. Повторите этот процесс, пока вы не удалите всю коллекцию или субколлекцию. Источник: https://firebase.google.com/docs/firestore/manage-data/delete-data#collections