首页 > 解决方案 > 方法未捕获 Firestore 超时错误

问题描述

我有以下代码,当互联网速度很慢时,我无法捕获 Firestore 超时错误。它只返回空数组。

static getEspeciallyProducts() {
    return new Promise(async (resolve, reject) => {
        try {
            const db = Firebase.firestore(),
                products = [],
                activeRef = await db.collection("products")
                    .orderBy("id")
                    .withConverter(ProductConverter)
                    .get();
            for (let doc of activeRef.docs) {
                const data = doc.data();
                if (_.isObject(data))
                    products.push(data);
            }
            resolve(products);
        } catch (error) {
            reject(error);
        }
    });
}

但是,我的另一种方法捕获了一个错误:

static getProductById(id) {
    return new Promise(async (resolve, reject) => {
        try {
            const docRef = Firebase.firestore().collection("products").doc(id),
                doc = await docRef.withConverter(ProductConverter).get();
            if (doc.exists)
                resolve(doc.data());
            else
                resolve(null);
        } catch (error) {
            reject(error);
        }            
    });
}

标签: javascriptgoogle-cloud-firestore

解决方案


如果 Internet 连接速度较慢或速度下降,Firestore 不会引发错误。它要么:

  1. 静默重试,直到连接可用,或者
  2. 放弃并回退到本地持久层。

如果是 #2,您将在控制台日志中看到一条消息。但是进行查询的代码不仅会失败。仅针对无法恢复的错误给出失败,例如违反安全规则和超出限制。

如果您希望代码在出现网络问题时失败,请考虑改用REST API


推荐阅读