Расписание облачной функции для обновления списка карт

Я пытаюсь написать запланированную облачную функцию для сброса значения «статуса» каждый день в 12 часов ночи. Вот моя структура пожарного магазина: Расписание облачной функции для обновления списка карт

Раньше я действительно не пробовал кодировать в javascript, но вот что мне удалось с моими небольшими знаниями:

const functions = require("firebase-functions");

const admin = require("firebase-admin");
admin.initializeApp();

const database = admin.firestore();


exports.Rst = functions.pubsub.schedule("0 0 * * *").onRun((context) => {
  const alist =
      database.collection("SA1XAoC2A7RYRBeAueuBL92TJEk1")
          .doc("afternoon").get().then((snapshot)=>snapshot.data["list"]);

  for (let i=0; i<alist.length; i++) {
    alist[i]["status"]=0;
  }

  database.collection("SA1XAoC2A7RYRBeAueuBL92TJEk1")
      .doc("afternoon").update({
        "list": alist,
      });

  return null;
});

Я получаю следующую ошибку при развертывании этой функции: Расписание облачной функции для обновления списка карт

Ожидаемый результат: Установите значения всех полей «статус» в 0. Расписание облачной функции для обновления списка карт

Похоже, что alist — это объект, с которым Firestore не может справиться. Возможно, вы захотите console.info(JSON.stringify(alist)) прямо перед попыткой записать его в базу данных, чтобы посмотреть, что с ним не так.

Frank van Puffelen 22.03.2022 14:40
Поведение ключевого слова "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
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, что alist — это объект, с которым Firestore не может справиться. Чтобы избавиться от каких-либо частей, с которыми не может справиться Firestore, вы можете сделать следующее:

database.collection("SA1XAoC2A7RYRBeAueuBL92TJEk1")
    .doc("afternoon").update({
      "list": JSON.parse(JSON.stringify(alist)) // ?
    });

Привет, Фрэнк, спасибо за ответ. Это устранило ошибку, но результат все еще не такой, как я ожидал. Он просто назначает пустую карту в поле «список» вместо обновления только значения «статуса».

Shah Raza 22.03.2022 15:47
Ответ принят как подходящий

Ваш alist вернет Promise { <pending> }. Его нужно выполнить со значением или отклонить с указанием причины (ошибка). Вы должны использовать метод .then для выполнения или использовать метод .catch для получения любых ошибок всех ожидающих обещаний. См. код ниже для справки:

const collectionName = "SA1XAoC2A7RYRBeAueuBL92TJEk1";
const documentName = "afternoon";
// created a reference to call between functions
const docRef = database.collection(collectionName).doc(documentName);

// Initialized a new array that will be filled later.
const tasks = [];

// Gets the data from the document reference
docRef.get()
// Fulfills the promise from the `.get` method
.then((doc) => {
  // doc.data.list contains the array of your objects. Looping it to construct a `tasks` array.
  doc.data().list.forEach((task) => {
    // Setting the status to 0 for every object on your list
    task.status = 0;
    // Push it to the initialized array to use it on your update function.
    tasks.push(task);
  })

  docRef.update({
    // The `tasks` structure here must be the same as your Firestore to avoid overwritten contents. This should be done as you're updating a nested field.
    list: tasks
  }, { merge: true });
})
// Rejects the promise if it returns an error.
.catch((error) => {
  console.info("Error getting document:", error);
});

Я оставил несколько комментариев к коду для лучшего понимания.


Вы также можете проверить эти документы:

Спасибо, Марк. Ваш ответ решил проблему.

Shah Raza 22.03.2022 16:08

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