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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:45:04