You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Functions任务入队报错:Error: Queue does not exist

问题描述

我有一个监听Firestore数据更新的函数eventAddedTrigger,代码如下:

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

我的enrol任务函数代码如下:

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

请问是否需要在其他位置注册该队列?

解决方案

不需要额外手动注册队列,你可以通过以下几点排查并解决问题:

  • 指定队列的区域
    你的enrol函数部署在europe-west6,但getFunctions()默认会使用us-central1区域,导致找不到对应队列。修改获取队列的代码,明确指定区域:

    const queue = getFunctions('europe-west6').taskQueue('enrol');
    

    也可以先初始化指定区域的Functions实例,再获取队列:

    const functionsInstance = getFunctions({ region: 'europe-west6' });
    const queue = functionsInstance.taskQueue('enrol');
    
  • 确认函数部署状态

    • 本地模拟器:启动模拟器时要包含tasks服务,确保enrol函数已在模拟器中运行,命令示例:
      firebase emulators:start --only firestore,functions,tasks
      
    • 生产环境:登录Firebase控制台,检查Cloud Functions页面中enrol函数是否已成功部署,状态显示为活跃。
  • 检查函数名称匹配度
    确保taskQueue中传入的函数名称'enrol'与导出的任务函数名称完全一致,包括大小写,避免拼写错误。

  • 本地模拟器的额外配置
    本地使用模拟器时,需要指定模拟器的主机地址,确保队列能正确连接到本地任务模拟器:

    const functionsInstance = getFunctions('europe-west6', {
      emulatorHost: 'localhost:5001'
    });
    const queue = functionsInstance.taskQueue('enrol');
    

内容的提问来源于stack exchange,提问作者brahms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:10:35