Запланированная функция иногда выдает ошибку при использовании sendToTopic

Я реализовал запланированную функцию в Firebase (1-го поколения), которая запускается каждые 5 минут. Фрагмент кода ниже представляет собой упрощенную версию функции, которая показывает только проблемную часть:

initializeApp()

export const example = runWith({
  timeoutSeconds: 20,
  memory: '128MB',
  maxInstances: 1,
  minInstances: 0,
})
  .region('europe-west1')
  .pubsub.schedule('*/5 * * * *')
  .onRun(async () => {
    const date = new Date();

    const weekday = date.getDay();
    const hour = date.getHours();
    const minute = Math.floor(date.getMinutes() / 15) * 15;

    const topicName = `${weekday}-${hour}-${minute}`;

    const messaging = getMessaging();

    try {
      await messaging.sendToTopic(
        topicName,
        {
          data: {
            mode: '15MinSchedule',
            type: topicName,
          },
        },
        {
          priority: 'high',
        },
      );
      debug(`Successfully sent to topic: ${topicName}`);
    } catch (err) {
      warn(`Error sending to topic ${topicName}:`, err);
    }
  });

Проблема возникает периодически, примерно каждые 2–3 часа, когда метод sendToTopic выдает следующую ошибку (полный журнал приведен в конце статьи):

"error":"Deprecated endpoint, see https://firebase.google.com/docs/cloud-messaging/migrate-v1"

Судя по сообщению об ошибке, похоже, что функция пытается получить доступ к устаревшей конечной точке FCM (v1). Я не уверен, но думаю, что пакет firebase-admin уже должен использовать правильную, не устаревшую конечную точку, не требуя ручной миграции, верно? Однако в большинстве случаев все работает нормально и, как я уже сказал, он просто выдает ошибку раз в 2 часа, после чего снова отправляет сообщения правильно.

То, что я уже пробовал

  • Удалил каталог сборки, package-lock.json и node_modules и повторно развернул функцию.
  • Удалена функция расписания в google-cloud и повторно развернута функция.

Версия пакета:

"firebase-admin": "^12.3.1",
"firebase-functions": "^5.0.1",

Журнал ошибок:

{
  "textPayload": "FirebaseMessagingError: An unknown server error was returned. Raw server response: \"{\"error\":\"Deprecated endpoint, see https://firebase.google.com/docs/cloud-messaging/migrate-v1\"}\"\n    at FirebaseMessagingError.fromServerError (/workspace/node_modules/firebase-admin/lib/utils/error.js:269:16)\n    at createFirebaseError (/workspace/node_modules/firebase-admin/lib/messaging/messaging-errors-internal.js:35:47)\n    at /workspace/node_modules/firebase-admin/lib/messaging/messaging-api-request-internal.js:80:75\n    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n    at async sendToTopic (/workspace/lib/scheduled/***.js:73:9)\n    at async Promise.all (index 1)\n    at async exports.default (/workspace/lib/scheduled/***.js:43:5)\n    at async /workspace/lib/group-functions/pubsub-group.js:56:5 {\n  errorInfo: {\n    code: 'messaging/unknown-error',\n    message: 'An unknown server error was returned. Raw server response: \"{\"error\":\"Deprecated endpoint, see https://firebase.google.com/docs/cloud-messaging/migrate-v1\"}\"'\n  },\n  codePrefix: 'messaging'\n}",
  "insertId": "66cdb534000ecdfcc85c9c9e",
  "resource": {
    "type": "cloud_function",
    "labels": {
      "function_name": "pubsub-min5Schedule",
      "region": "europe-west1",
      "project_id": "***"
    }
  },
  "timestamp": "2024-08-27T11:15:00.970236Z",
  "severity": "WARNING",
  "labels": {
    "runtime_version": "nodejs20_20240818_20_16_0_RC00",
    "execution_id": "***",
    "instance_id": "***"
  },
  "logName": "projects/***/logs/cloudfunctions.googleapis.com%2Fcloud-functions",
  "trace": "projects/***/traces/cee5cfbbaf474cae746709dafadd9785",
  "receiveTimestamp": "2024-08-27T11:15:00.995052585Z"
}

53
1

Ответ:

Решено

Я нашел решение сам:

По состоянию на 22 августа 2024 г. методы sendToTopic и sendToCondition устарели, и теперь нам нужно использовать send для обоих. Я запускал это в течение дня, и все работает гладко, без каких-либо проблем.