Flutter调用Firebase Cloud Functions读取Firestore时遇INTERNAL异常
解决Cloud Functions调用时的INTERNAL错误
从你贴出的Cloud Functions控制台日志,我立刻定位到了问题的核心:
TypeError: db.collection(...).document is not a function
下面是具体的问题分析和修复方案:
1. Firestore API方法名写错了
在Firebase Admin SDK的JS版本里,获取单个文档的正确方法是doc(),而不是document()。你代码里的db.collection('feed').document("pets")这一行用了错误的方法名,直接导致运行时抛出异常,最终让客户端收到了INTERNAL错误。
2. 变量赋值有错误
在then回调里,你写了colors = color;——这里的color是循环里的局部变量,循环结束后这个变量根本不存在,会把colors变成undefined,就算前面的查询成功,返回的结果也完全不对。
修复后的Cloud Functions代码
exports.getDownloadUrl = functions.region("asia-south1").https.onCall((data, context) => { return new Promise((resolve, reject) => { const colors = {}; const db = admin.firestore(); db.collection('feed') .doc("pets") // 把document改成正确的doc方法 .collection("cats") .get() .then(snapshot => { snapshot.forEach(doc => { const key = doc.id; const colorData = doc.data(); colorData['url'] = key; // 重命名变量避免冲突 colors[key] = colorData; }); const colorsStr = JSON.stringify(colors, null, '\t'); console.log('colors callback result : ' + colorsStr); resolve(colors); // 直接返回组装好的colors对象 }).catch(reason => { console.log('查询失败,原因: ' + reason); reject(reason); }); }); });
额外注意:Flutter端函数名要匹配
你Flutter代码里调用的函数名是downloadUrl,但云端定义的函数名是getDownloadUrl,这会导致找不到函数!必须把Flutter里的函数名改成和云端一致的:
void cloudFunc() async { final CloudFunctions cf = CloudFunctions( app: Firebase.app(), region: 'asia-south1' ); final HttpsCallable urlHttpsCallable = cf.getHttpsCallable( functionName: 'getDownloadUrl', // 和云端函数名保持一致 ); final HttpsCallableResult urlHttpsCallableResult = await urlHttpsCallable.call(); print("url: " + urlHttpsCallableResult.data.toString()); }
最后一步
部署修改后的Cloud Functions,再重新测试调用,应该就能正常拿到Firestore里的图片URL数据了。
内容的提问来源于stack exchange,提问作者Patrick Schick
相关产品推荐
相关产品推荐

