Firebase Functions TypeError:无法读取undefined的arrayUnion属性
解决
TypeError: Cannot read properties of undefined (reading 'arrayUnion')问题 问题根源
你混合使用了CommonJS和ES模块两种导入方式,导致admin.firestore.FieldValue无法正确访问。代码里同时用了import admin = require("firebase-admin");和ES模块的import { initializeApp, getFirestore } from "firebase-admin/...",这种混用会破坏Firebase Admin SDK的模块化结构,使得admin.firestore对象未被正确初始化。
解决步骤
- 统一使用ES模块导入:直接从
firebase-admin/firestore导入FieldValue,不再依赖admin对象的引用。 - 替换
admin.firestore.FieldValue为导入的FieldValue:在更新文档时使用直接导入的FieldValue调用arrayUnion。
修改后的完整代码
// Firebase SDKs import { logger } from "firebase-functions/v2"; import { onRequest } from "firebase-functions/v2/https"; import { initializeApp } from "firebase-admin/app"; import { getFirestore, FieldValue } from "firebase-admin/firestore"; initializeApp(); interface Item { itemCategory: number; itemIndex: number; itemTimestamp: number; itemCount: number; itemStatus: number; } exports.handleItemRequest = onRequest(async (req, res) => { try { const { sectorID, locationID, itemRequests, entityID } = req.body.data; // Process each user's item requests for (const userID of Object.keys(itemRequests)) { itemRequests[userID] = itemRequests[userID].filter((item: Item) => { // Remove item request if count is 0 or less if (item.itemCount <= 0) { return false; } // Set status to 0 if not already 0 if (item.itemStatus !== 0) { item.itemStatus = 0; } return true; }); } // Firestore document reference const docPath = `entities/${entityID}/sectors/${sectorID}/locations/${locationID}`; const docRef = getFirestore().doc(docPath); // Update the confirmedItems field await docRef.update({ confirmedItems: FieldValue.arrayUnion( ...Object.values(itemRequests).flat(), ), }); // Success response res.json({success: true}); } catch (error) { if (error instanceof Error) { logger.error("Error handling item request: ", error); res.json({success: false, error: error.message}); } else { logger.error("Unexpected error type"); res.json({success: false}); } } });
额外注意事项
- 确保你的
package.json中type字段设置为"module"(如果用ES模块),或者保持纯CommonJS风格,不要混用两种导入方式。 - 检查
firebase-admin和firebase-functions的版本,确保使用支持模块化导入的最新稳定版(v9及以上)。
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

