Облачные функции могут быть вызваны несколько раз. Вы должны убедиться, что ваши функции могут обрабатывать повторных попыток .
Однако ваша ошибка, вероятно, связана со значением клавиши update_at
. Если значение этого ключа является объектом, операнды ===
и !==
не будут давать правильный результат. Вам нужно будет проверить объект на наличие метода "isEqual" или "equals" или использовать стороннее решение, такое как _.isEqual
.
Ниже я произвел рефакторинг вашего кода для производительности и простоты использования. Я не смог определить объект rest
, который вы использовали для вызова API, поэтому я заменил его на node-fetch
.
const fetch = require("node-fetch"); // see https://www.npmjs.com/package/node-fetch
// for object equality tests
// const isEqual = require("lodash.isequal");
const STUDENT_SERVICE_DEFAULT_OPTIONS = {
method: "post",
headers: {
"Content-Type": "application/json"
}
}
exports.triggerTimeStudent= functions.firestore
.document("users/{userId}/class/{classId}/students/{studentId}")
.onUpdate( (change, context) => {
const beforeStatus = change.before.get("update_at"); // accessed directly for performance
const afterStatus = change.after.get("update_at");
// If beforeStatus and afterStatus are
// - string, boolean, int, etc.: use beforeStatus === afterStatus
// - firestore.Timestamp objects: use beforeStatus.isEqual(afterStatus)
// - custom objects: use isEqual(beforeStatus, afterStatus) from lodash/underscore packages
if (beforeStatus === afterStatus) {
console.log("Status unmodified. Ignored change.");
return;
}
const data = {
student_name: change.after.get("name")
}
console.log("Making API call...", { data });
const fetchOptions = {
...STUDENT_SERVICE_DEFAULT_OPTIONS,
body: JSON.stringify(data)
}
return fetch("https://example.com/api/v1/student/add-by-name", fetchOptions)
.then(response => {
if (!response.ok) { // see "Handling client and server errors" in "node-fetch" docs
throw new Error("Unexpected API response: " + response.statusText);
}
console.log("Successfully added student!");
})
.catch(error => console.error("Failed to add student!", { error, fetchOptions }));
});
Примечание: Вы можете просматривать зарегистрированные сообщения из облачных функций в консоли Firebase .