Я пытаюсь написать запланированную облачную функцию для сброса значения «статуса» каждый день в 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 не может справиться. Чтобы избавиться от каких-либо частей, с которыми не может справиться Firestore, вы можете сделать следующее:
database.collection("SA1XAoC2A7RYRBeAueuBL92TJEk1")
.doc("afternoon").update({
"list": JSON.parse(JSON.stringify(alist)) // ?
});
Привет, Фрэнк, спасибо за ответ. Это устранило ошибку, но результат все еще не такой, как я ожидал. Он просто назначает пустую карту в поле «список» вместо обновления только значения «статуса».
Ваш 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);
});
Я оставил несколько комментариев к коду для лучшего понимания.
Вы также можете проверить эти документы:
Спасибо, Марк. Ваш ответ решил проблему.
Похоже, что
alist
— это объект, с которым Firestore не может справиться. Возможно, вы захотитеconsole.info(JSON.stringify(alist))
прямо перед попыткой записать его в базу данных, чтобы посмотреть, что с ним не так.