Firestore触发Cloud Function(Gen2)报TypeError错误的解决求助
Firestore Gen2触发器TypeError问题解决
问题场景
部署Gen2版本Cloud Function,期望Firestore的messages集合新增文档时触发函数,向文档添加硬编码的test字段。函数能被触发,但始终抛出TypeError: Cannot read properties of undefined (reading 'value')错误,自定义代码和官方makeuppercase示例代码均出现此问题。
错误信息
TypeError: Cannot read properties of undefined (reading 'value') at func (/workspace/node_modules/firebase-functions/lib/v2/providers/firestore.js:297:115) at /layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/function_wrappers.js:113:25 at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
用户代码
const {logger} = require("firebase-functions"); const {onDocumentCreated} = require("firebase-functions/v2/firestore"); const {initializeApp} = require("firebase-admin/app"); const { getFirestore } = require("firebase-admin/firestore"); initializeApp(); const functionsRegion = "europe-west1"; exports.testtrigger = onDocumentCreated({region: functionsRegion}, "/messages/{documentId}", (event) => { logger.log("Inside test_trigger function"); const test = "Function was triggered on new document creation."; const documentRef = getFirestore().doc(event.data.value.name); return documentRef.set({ test }, { merge: true }); });
用户还尝试过:
return event.data.ref.set({test}, {merge: true});
官方示例代码
// Listens for new messages added to /messages/:documentId/original // and saves an uppercased version of the message // to /messages/:documentId/uppercase exports.makeuppercase = onDocumentCreated("/messages/{documentId}", (event) => { // Grab the current value of what was written to Firestore. const original = event.data.data().original; // Access the parameter `{documentId}` with `event.params` logger.log("Uppercasing", event.params.documentId, original); const uppercase = original.toUpperCase(); // You must return a Promise when performing // asynchronous tasks inside a function // such as writing to Firestore. // Setting an 'uppercase' field in Firestore document returns a Promise. return event.data.ref.set({uppercase}, {merge: true}); });
解决方案
问题根源是Firebase Cloud Function Gen2与Gen1的Firestore触发器事件结构不同:
- Gen1中
event.data直接是DocumentSnapshot实例,可直接调用.ref、.data()等方法 - Gen2中
event.data是一个封装对象,实际的DocumentSnapshot需要通过event.data.doc获取
修正后的用户代码
const {logger} = require("firebase-functions"); const {onDocumentCreated} = require("firebase-functions/v2/firestore"); const {initializeApp} = require("firebase-admin/app"); initializeApp(); const functionsRegion = "europe-west1"; exports.testtrigger = onDocumentCreated({region: functionsRegion}, "/messages/{documentId}", (event) => { logger.log("Inside test_trigger function"); const test = "Function was triggered on new document creation."; // 通过event.data.doc.ref获取文档引用 return event.data.doc.ref.set({ test }, { merge: true }); });
修正后的官方示例代码
// Listens for new messages added to /messages/:documentId/original // and saves an uppercased version of the message // to /messages/:documentId/uppercase exports.makeuppercase = onDocumentCreated("/messages/{documentId}", (event) => { // 从event.data.doc中获取文档数据 const original = event.data.doc.data().original; logger.log("Uppercasing", event.params.documentId, original); const uppercase = original.toUpperCase(); // 用event.data.doc.ref更新文档 return event.data.doc.ref.set({uppercase}, {merge: true}); });
内容的提问来源于stack exchange,提问作者Ana
相关产品推荐
相关产品推荐

