javascript 在Firebase函数中排队任务时,出现“错误:队列不存在”

lnlaulya  于 2023-01-04  发布在  Java
关注(0)|答案(1)|浏览(121)

我有一个函数触发数据库更新:

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
        }
      )
    }
  });

这个函数触发良好,但是当涉及到排队时,我总是得到以下错误

Error: Queue does not exist

而不管我运行的是仿真函数还是生产函数。
注册函数如下所示:

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,
});

我必须在别的地方登记排队吗?

fumotvh3

fumotvh31#

我已经尝试重现这个问题,并发现您需要使用以下语法初始化App:

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

其中DATABASE_NAME将是控制台中来自firebaseConfig的databaseURL。您可以通过访问应用程序部分下的项目设置来获取数据库。
我找不到任何您可能初始化SDK的文档。我找到了显示SDK初始化的推荐文档。

相关问题