为什么搭配CloudFirestore ForOf循环的Cloud Function持续抛出未知错误
问题排查结果
- 嵌套属性父对象未初始化
处理携带nestedProperties参数的文档时,没有先给data[options.id]初始化空对象,直接对其下的属性赋值,会抛出「无法为undefined设置属性」的运行错误,这是触发未知错误的核心原因。 - lodash依赖未导入(潜在问题)
代码中使用_.get获取嵌套字段,如果没有提前导入lodash依赖,会抛出_未定义的错误。 - 集合路径末尾多余斜杠
传入的集合路径为Core/,末尾携带斜杠,Firestore拼接文档路径时会生成Core//Employees这类带连续斜杠的无效路径,触发路径格式错误。 - 云函数错误码笔误
最外层catch块中传入的是字符串"SPECIAL_CODE",而非你定义的SPECIAL_CODE变量,会导致错误上报的编码不符合预期。
修复后的getDocuments函数代码
import _ from 'lodash'; // 确认提前导入lodash依赖 export async function getDocuments( documents: { collection: string, documentName: string, options: { idReturn: string, nestedProperties: { idReturn: string, name: string }[] } }[], code: string): Promise<{ status: 201, code: string, subcode: number, devDescription: string, data: any }> { const data: any = {}; const response: { devDescription: string, subcode: number } = { devDescription: "The document was found and retrieved successfully.", subcode: 1 }; if (documents.length > 1) { response.devDescription = "Documents were found and obtained successfully."; response.subcode = 2; } for (const iterator of documents) { // 自动清理路径末尾的斜杠,避免生成无效路径 const cleanCollectionPath = iterator.collection.replace(/\/$/, ''); const docRef = { path: cleanCollectionPath, name: iterator.documentName }; const options = { id: iterator.options.idReturn, nestedProperties: iterator.options.nestedProperties }; const doc = await database.collection(docRef.path).doc(docRef.name).get(); if (!doc.exists) { data[options.id] = "The document " + docRef.name + " does not exist in the specified path: " + docRef.path; if (documents.length === 1) { response.devDescription = "The document was not found. Check the DATA for more information."; response.subcode = 3; } else { response.devDescription = "One, several or all documents were not found. Check the DATA for more information."; response.subcode = 3; } } else { const docData: any = doc.data(); if (options.nestedProperties.length === 0) { data[options.id] = docData; } else { // 先初始化父对象,避免赋值undefined属性报错 data[options.id] = {}; for (const nested of options.nestedProperties) { data[options.id][nested.idReturn] = _.get(docData, nested.name); } } } } return { status: 201, code: code, subcode: response.subcode, devDescription: response.devDescription, data: data }; }
云函数笔误修复
将最外层catch块的代码
.catch(() => response.status(500).send(security.error500("SPECIAL_CODE", 1)));
修改为
.catch(() => response.status(500).send(security.error500(SPECIAL_CODE, 1)));
内容的提问来源于stack exchange,提问作者raulabad
相关产品推荐
相关产品推荐

