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

如何为Firestore Node.js库的操作设置超时(截止时间)?

Firestore Node.js 操作设置超时/截止时间

可以实现,下面提供两种实用方案:

方案一:SDK 内置超时配置(推荐)

从 Firebase Admin SDK v11+ 或 Firestore 模块化 SDK v9+ 开始,支持直接在操作选项中指定超时时间,底层会自动终止超时请求,比手动实现更可靠。

模块化 SDK(v9+)示例

import { getDoc, doc } from "firebase/firestore";

const docRef = doc(db, "your-collection", "target-doc");
// 设置30秒超时
const requestOptions = { timeoutMillis: 30000 };

try {
  const docSnap = await getDoc(docRef, requestOptions);
  if (docSnap.exists()) {
    console.log("文档内容:", docSnap.data());
  } else {
    console.log("目标文档不存在");
  }
} catch (err) {
  if (err.code === "deadline-exceeded") {
    console.error("操作超时");
  } else {
    console.error("获取文档失败:", err);
  }
}

Admin SDK 示例

const admin = require("firebase-admin");
const db = admin.firestore();

const docRef = db.collection("your-collection").doc("target-doc");
// 设置20秒超时
const requestOptions = { timeoutMillis: 20000 };

try {
  const docSnap = await docRef.get(requestOptions);
  if (docSnap.exists) {
    console.log("文档内容:", docSnap.data());
  } else {
    console.log("目标文档不存在");
  }
} catch (err) {
  if (err.code === "deadline-exceeded") {
    console.error("操作超时");
  } else {
    console.error("获取文档失败:", err);
  }
}

方案二:Promise.race 手动实现超时

如果用的是旧版本 SDK,或者需要更灵活的控制逻辑,可以用Promise.race结合setTimeout实现:

// 封装带超时的文档获取函数
async function fetchDocWithTimeout(docRef, timeoutMs = 30000) {
  const timeoutPromise = new Promise((_, reject) => {
    setTimeout(() => reject(new Error("操作超时")), timeoutMs);
  });
  
  const docFetchPromise = docRef.get();
  return Promise.race([docFetchPromise, timeoutPromise]);
}

// 使用示例
try {
  const docSnap = await fetchDocWithTimeout(db.collection("your-collection").doc("target-doc"), 25000);
  if (docSnap.exists) {
    console.log("文档内容:", docSnap.data());
  } else {
    console.log("目标文档不存在");
  }
} catch (err) {
  if (err.message === "操作超时") {
    console.error("获取文档超时");
  } else {
    console.error("获取文档失败:", err);
  }
}

注意事项

  • 内置超时方案会直接终止底层网络请求,而Promise.race只是在代码层面抛出超时错误,底层请求可能仍在后台运行,优先推荐内置方案。
  • 20-30秒的超时设置符合多数场景的网络环境,可根据实际业务调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 05:08:29