![](/img/trans.png)
[英]AWS SQS issue. The specified queue does not exist for this wsdl version
[英]"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.