Удалить пакет документов с помощью административного SDK и вызываемой облачной функции способом, наиболее похожим на клиентский SDK?

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

//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;
});
I am getting a syntax error on batch.delete how to pass the right arguments in to the batch delete to reference that doc I want to submit for deletion before commit ?

Здравствуйте, не могли бы вы поделиться своим контентом package.json, а также тем, как вы определяете переменную db.

Renaud Tarnec 09.05.2022 09:23
Поведение ключевого слова "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) для оценки ваших знаний,...
0
1
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Удалить принимает один параметр, ссылку на документ, который нужно удалить.

data.arr.forEach((docId: string) => {
  batch.delete(doc(db, "Data", docId));
});

к сожалению, я получаю, что документ deleteClients не является функцией.

stop-error 09.05.2022 06:00
Ответ принят как подходящий

В вашем коде есть несколько ошибок:

  • data.arr.forEach() не может работать, потому что ваш объект данных содержит один элемент с ключом array, а не с ключом arr.
  • Вы смешиваете синтаксис JS SDK v9 и Административный SDK. См. синтаксис пакетной записи Admin SDK здесь.
  • Вам нужно отправить некоторые данные обратно клиенту, когда вся асинхронная работа будет завершена, в правильно расторгнуть ваш CF.
  • Вы делаете 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. Мне нужно больше узнать, теперь это имеет больше смысла.

stop-error 09.05.2022 22:51

есть еще небольшой вопрос, а что если пакет.delete(parentCollection.doc(docId)); ошибки, но мы возвращаем {result: 'success'} до этого улова? не даст ли он в этом случае ложного срабатывания? должен ли успех возврата быть после улова, подтверждающего, что все прошло нормально?

stop-error 10.05.2022 01:01

Если в пакете есть одна ошибка, она будет перехвачена блоком catch. «Должен ли возвратный успех быть после улова, подтверждающего, что все прошло нормально?» => Абсолютно нет! Это завершит облачную функцию, см. документ, указанный в ответе.

Renaud Tarnec 10.05.2022 07:12

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