如何解决Firebase定时函数报错:9 FAILED_PRECONDITION
问题:定时Firestore清理函数触发FAILED_PRECONDITION错误
我们有一个定时函数scheduledFunction,每隔30分钟调用_clearOldDocuments函数,通过collectionGroup删除所有名为reports的集合中生成时间超过10分钟的文档。代码如下:
exports.scheduledFunction = functions.pubsub .schedule("every 30 minutes") .onRun(async () => { return Promise.all([_clearOldDocuments()]); }); async function _clearOldDocuments() { const date = Date.now() - 600000; // 10 min const reports = await admin .firestore() .collectionGroup("reports") .where("generateDate", "<", date) .get(); const batch = admin.firestore().batch(); reports.forEach((d) => batch.delete(d.ref)); await batch.commit(); }
错误详情
在GCP控制台日志中收到Error: 9 FAILED_PRECONDITION错误,无额外排查信息,且Logs Explorer视图中跟踪信息分散,难以定位问题。错误栈如下:
Error: 9 FAILED_PRECONDITION: at callErrorFromStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call.js:31:19) at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client.js:357:73) at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:323:181) at /workspace/node_modules/@grpc/grpc-js/build/src/resolving-call.js:94:78 at process.processTicksAndRejections (node:internal/process/task_queues:77:11)
过往解决记录
今年4月首次遇到该问题时,通过Firestore控制台创建了以下单字段索引解决:
collectionId: reports fieldPath: generateDate Collection group scope: Descending enabled

近期操作与问题复发
上周部署了由Firebase CLI根据项目现有索引生成的firestore.indexes.json文件,内容如下:
{ "fieldOverrides": [ { "collectionGroup": "reports", "fieldPath": "generateDate", "indexes": [ { "order": "ASCENDING", "queryScope": "COLLECTION" }, { "order": "DESCENDING", "queryScope": "COLLECTION" }, { "arrayConfig": "CONTAINS", "queryScope": "COLLECTION" }, { "order": "DESCENDING", "queryScope": "COLLECTION_GROUP" } ], "ttl": false } ], "indexes": [] }
部署后定时函数再次失效,原本以为通过该JSON文件可避免后续部署时的索引问题,结果问题复发。
疑问
- 为何部署托管服务会持续破坏该定时函数?
- 是否是
firestore.indexes.json与之前通过控制台配置的单字段索引发生了冲突?
恳请提供排查方向或解决方案。
内容的提问来源于stack exchange,提问作者skillit zimberg
相关产品推荐
相关产品推荐

