Триггер вызова Firebase Cloud Funtion многократно - PullRequest
0 голосов
/ 02 апреля 2020

Я использую Firebase и создаю триггер для прослушивания любых изменений из студенческого документа. Если студенческий документ изменится, я внесу изменения в остальные API. Но мой вызов функции много раз.

Сильфон - моя функция:

exports.triggerTimeStudent= functions.firestore
    .document('users/{userId}/class/{classId}/students/{studentId}')
    .onUpdate( (change, context) => {
        const newValue = change.after.data();
        const previousValue = change.before.data();
        const {update_at: afterStatus} = newValue;
        const {update_at: beforeStatus} = previousValue;
        const {name: name} = newValue;
        if (afterStatus !== beforeStatus) {
                try {

                    var data = {
                        "student_name": name,
                    };
                    console.log(data);
                    console.log("Inside Rest API");
                    return rest.post("https://example.com/api/v1/student/add-by-name", {
                        ...studentServiceRestOption, ...{
                            body:  JSON.stringify(data)
                        }
                    });

                } catch (error) {
                    return res
                        .status(HttpStatus.INTERNAL_SERVER_ERROR)
                        .send(buildError({
                            code: errorCode.SYSTEM_ERROR,
                            message: error.message,
                        }))
                }

        }

Я не могу знать, почему функция вызывается несколько раз. Я хочу звонить только раз. Моя функция неверна. Пожалуйста, помогите

1 Ответ

1 голос
/ 02 апреля 2020

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

Однако ваша ошибка, вероятно, связана со значением клавиши 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 .

...