Я реализовал запланированную функцию в 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 часа, после чего снова отправляет сообщения правильно.
То, что я уже пробовал
Версия пакета:
"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"
}
Я нашел решение сам:
По состоянию на 22 августа 2024 г. методы sendToTopic
и sendToCondition
устарели, и теперь нам нужно использовать send
для обоих. Я запускал это в течение дня, и все работает гладко, без каких-либо проблем.