簡體   English   中英

在 Firebase 函數中排隊任務時出現“錯誤:隊列不存在”

[英]"Error: Queue does not exist" when queue-ing task in Firebase Functions

我有一個在數據庫更新時觸發的函數:

exports.eventAddedTrigger = functions
  .region('europe-west6')
  .firestore
  .document('users/{user_id}/events/{event_id}')
  .onCreate(async (snap, context) => {
    const event = snap.data();

    if (event) {
      const { user_id, event_id } = context.params;
      const queue = getFunctions().taskQueue('enrol');
      const signupDate = DateTime.fromSeconds(event.signupDate.seconds).minus({minutes: 2});
      const now = DateTime.local({zone: 'Europe/Zurich'})
      let scheduleDelaySeconds = Math.floor(signupDate.diff(now, 'seconds').seconds);
      if (scheduleDelaySeconds < 0) {
        scheduleDelaySeconds = 10;
      }
      functions.logger.info(`Scheduling enrollment for ${signupDate.toISO()} in ${scheduleDelaySeconds} seconds`);
      await queue.enqueue(
        { user_id, event_id },
        {
          scheduleDelaySeconds
        }
      )
    }
  });

這個 function 觸發很好,但是當涉及到入隊時,我總是得到以下錯誤

Error: Queue does not exist

不管我是運行 function 模擬還是生產。

注冊 function 如下所示:

exports.enrol = functions
  .region('europe-west6')
  .runWith({
    timeoutSeconds: 540,
    memory: '1GB',
  })
  .tasks
  .taskQueue()
  .onDispatch(async (data) => {
    const { user_id, event_id } = data.body;
    await _enrol(user_id, event_id, db);
    functions.logger.info(`Enrolled user ${user_id} to event ${event_id}`);
  });

據我所知,我已經正確初始化了我的應用程序:

initializeApp({
  serviceAccountId: process.env.FIREBASE_SERVICE_ACCOUNT_ID,
});

我必須在其他地方注冊隊列嗎?

我想出了這個對我來說。 如果您為 function 使用非默認區域(即不是 us-central1),那么您需要指定您的隊列名稱,包括您的目標區域。 模式在這里定義https://github.com/firebase/firebase-admin-node/blob/master/src/utils/index.ts#L293

所以像這樣使用你的 enqueue function:

await this.functions 
    .taskQueue<INotification<any>[]>(`locations/${region}/functions/${queueName}`) 
    .enqueue(data);

我已嘗試重現此問題並發現您需要使用以下語法初始化應用程序:

import {applicationDefault, initializeApp} from "firebase-admin/app";
initializeApp({
  credential: applicationDefault(),
  databaseURL: "https://<DATABASE_NAME>.firebaseio.com",
});

其中 DATABASE_NAME 將是控制台中firebaseConfig的數據庫 URL。您可以通過訪問應用程序部分下的項目設置來獲取數據庫。

另外,您還必須按照文檔中所示將函數排入隊列,並確保在大約 1 分鍾的間隔內將任務排入隊列,並且您沒有像上面的文檔中提供的那樣在 queue.enqueue 中包含dispatchDeadlineSeconds

我無法從您可能已初始化 SDK 的位置找到任何文檔。我找到了推薦的文檔,其中顯示了 SDK 的初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM