使用Firebase Cloud Function写入Firestore时触发[firebase_functions/not-found] NOT_FOUND异常的问题求助
问题根源
嘿,这个坑我之前也踩过!核心原因是你搞混了Firebase Cloud Function的两种完全不同的类型——Firestore触发器函数和HTTP可调用函数,这才导致了NOT_FOUND错误。
你写的addfield是一个被动触发的Firestore触发器:只有当指定的userInfo/DsJcWyIwSDkf0BYTFBq9xfXkzGK7文档被创建时,它才会自动执行。但你的Flutter代码却用HttpsCallable去主动调用它,相当于在找一个名为addfield的主动可调用函数——而你根本没部署这种类型的函数,系统自然找不到。
解决方案(分两种场景)
根据你的实际需求选一种方案:
场景1:需要客户端主动调用函数写入Firestore
如果你想让Flutter端主动触发函数给Firestore文档加字段,那得把Cloud Function改成HTTP可调用函数,同时修正Flutter代码:
Cloud Function端修改(index.js)
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); // 必须初始化Admin SDK才能操作Firestore exports.addfield = functions.https.onCall(async (data, context) => { // 可选:验证用户是否登录,防止匿名调用 if (!context.auth) { throw new functions.https.HttpsError('unauthenticated', '请先登录'); } try { // 给指定文档添加字段(merge: true确保不覆盖原有数据) await admin.firestore().doc('userInfo/DsJcWyIwSDkf0BYTFBq9xfXkzGK7').set( { newField: '你要添加的字段值' }, { merge: true } ); return { success: true, message: '字段添加成功' }; } catch (error) { throw new functions.https.HttpsError('internal', '写入失败', error.message); } });
Flutter端代码修正
原代码有语法错误(void和Future<void>不能同时声明),修改后:
Future<void> addField() async { try { final callable = FirebaseFunctions.instance.httpsCallable('addfield'); final result = await callable.call(); print('操作成功:${result.data}'); } catch (e) { print('出错了:$e'); } }
场景2:需要文档创建时自动触发函数操作
如果你本来就想让函数在指定文档被创建时自动加字段,那不需要Flutter端调用函数,只要确保触发器配置正确:
Cloud Function端完善(index.js)
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); exports.addfield = functions.firestore .document('userInfo/DsJcWyIwSDkf0BYTFBq9xfXkzGK7') .onCreate(async (snap, context) => { // 获取刚创建的文档引用 const docRef = snap.ref; // 自动添加字段(merge: true避免覆盖原有数据) await docRef.set({ autoAddedField: '触发器自动添加' }, { merge: true }); return null; });
Flutter端只需创建文档
此时Flutter端只需要负责创建指定文档,函数会自动触发:
Future<void> createUserDoc() async { await FirebaseFirestore.instance .doc('userInfo/DsJcWyIwSDkf0BYTFBq9xfXkzGK7') .set({ 'name': '测试用户' }); }
关键注意事项
- 重新部署函数:修改完Cloud Function后,必须运行
firebase deploy --only functions命令重新部署,否则修改不会生效。 - 项目一致性:确保Flutter端连接的Firebase项目和Cloud Function部署的项目是同一个。
- 权限检查:如果是可调用函数,记得添加用户身份验证(如示例中的
context.auth检查),防止恶意调用。 - 函数状态检查:可以在Firebase控制台的「Functions」页面查看函数是否部署成功、是否有执行日志。
内容的提问来源于stack exchange,提问作者Abdulrahman
相关产品推荐
相关产品推荐

