在Next.js 14服务器组件中获取完整Firestore错误信息
解决Next.js服务器组件中Firestore错误信息丢失的问题
问题根源
你用throw new Error(error)抛出错误时,Firestore的原始错误对象被转换成普通Error的字符串形式,导致包含索引创建URL的关键细节被丢失。Firestore错误对象本身携带code、含索引链接的message、errorInfo等字段,直接包装会丢失这些信息。
解决方案
1. 直接抛出原始错误
无需用new Error()包装,直接抛出Firestore返回的原始错误对象,Next.js的错误边界会捕获并展示完整错误信息:
async function getData() { let res; try { res = await dbAdmin .collectionGroup("Business") .where("info.slug.short", "==", "enterprise") .get(); } catch (error) { // 直接抛出原始错误,保留所有细节 throw error; } // 修正:collectionGroup.get()返回QuerySnapshot,用empty判断是否无结果 if (res.empty) { return undefined; } // 按需返回单个或所有文档数据,示例返回所有文档数据 return res.docs.map(doc => doc.data()); }
2. 自定义错误并保留关键信息
如果需要自定义错误消息,同时保留Firestore的细节,可以手动提取错误字段:
async function getData() { let res; try { res = await dbAdmin .collectionGroup("Business") .where("info.slug.short", "==", "enterprise") .get(); } catch (error) { const firestoreError = new Error(`Firestore查询失败: ${error.message}`); // 附加原始错误的关键字段 firestoreError.code = error.code; firestoreError.details = error.details; firestoreError.errorInfo = error.errorInfo; throw firestoreError; } if (res.empty) { return undefined; } return res.docs.map(doc => doc.data()); }
3. 开发环境打印完整错误
开发阶段可以在catch中打印完整错误对象,直接从控制台获取索引创建URL:
async function getData() { let res; try { res = await dbAdmin .collectionGroup("Business") .where("info.slug.short", "==", "enterprise") .get(); } catch (error) { // 开发环境打印完整错误,控制台会显示带索引URL的message console.error("Firestore完整错误:", error); throw error; } if (res.empty) { return undefined; } return res.docs.map(doc => doc.data()); }
额外修正:QuerySnapshot判断逻辑错误
你的代码中!res.exists是错误用法:collectionGroup.get()返回的是QuerySnapshot(查询结果集合),而exists是单个文档对象(DocumentSnapshot)的属性。判断查询是否无结果应该使用res.empty。
内容的提问来源于stack exchange,提问作者Taio
相关产品推荐
相关产品推荐

