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

1

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

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

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

Облачные функции (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 предупреждения)

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

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

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

Теги:
firebase
google-cloud-functions

1 ответ

0
Лучший ответ

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню