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
相关产品推荐
相关产品推荐

