Удалить всю коллекцию с помощью облачных функций

Удалить коллекцию с помощью функции, созданной в Cloud Functions

Мне нужно удалить всю коллекцию с несколькими документами при удалении пользователя, поэтому я решил создать функцию, чтобы она запускалась при удалении пользователя.

Ниже приведен код.

Облачные функции (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 deploy --only functions возникает следующая ошибка:

65:11 предупреждение Ожидается, что стрелочная функция не вернет значение непротиворечивый возврат

65:18 предупреждение Избегайте вложенности обещает / нет вложенности

69:11 error Каждый then () должен возвращать значение или выдавать обещание / всегда-возврат

✖ 3 проблемы (1 ошибка, 2 предупреждения)

Что я делаю неправильно?

Как я могу удалить всю коллекцию при удалении пользователя?

Если вы можете опубликовать приведенный выше код с логикой, которую я должен применить, я буду очень благодарен.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
1 488
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сделайте следующее:

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.info(error);
        return false; 
    });
});

Как отражено в вашем коде и как указано в документации (см. Отрывок ниже), вы можете удалять документы партиями, если коллекция очень большая. Я позволю вам адаптировать для этого приведенный выше код, если вы сочтете это необходимым.

If you have larger collections, you may want to delete the documents in smaller batches to avoid out-of-memory errors. Repeat the process until you've deleted the entire collection or subcollection. Source: https://firebase.google.com/docs/firestore/manage-data/delete-data#collections

Другие вопросы по теме