Firebase Functions日志正常,Flutter调用云函数却返回null求助
问题分析
你的云函数存在核心问题:未返回异步操作的Promise。functions.https.onCall要求函数返回Promise(或直接返回值),但你的代码中admin.firestore().collection(path).get()是异步操作,外层函数未返回该Promise链,导致云函数在Firestore查询完成前就结束执行,最终向客户端返回null。此外,错误处理使用response.send(reason)不符合onCall函数的规范,该类型函数不依赖response对象,需通过抛出特定错误返回异常信息。
修正后的云函数代码
exports.getHouses = functions.https.onCall((data, context) => { const pathBeginning = "users/"; console.log(data.userID); const path = `${pathBeginning}${data.userID}/houses`; // 关键:返回Firestore查询的Promise链,确保异步操作完成后再返回结果 return admin.firestore().collection(path).get() .then(snapshot => { console.log("COLECTION WHERE DOCUMENTS ARE RETREIVED:"); console.log(path); const houses = []; snapshot.forEach(doc => { const newHouse = { id: doc.id, address: doc.data().address }; houses.push(newHouse); // 用push替代concat,数组构建更高效 }); console.log("THE FOLLOWING LOG SHOULD RETURN THE FULL LIST OF HOUSES:") console.log(houses); return houses; }) .catch(reason => { // 按onCall规范抛出错误,客户端可正常捕获 throw new functions.https.HttpsError('unknown', 'Failed to fetch houses', reason); }); });
关键修改说明
- 外层函数直接返回Firestore查询的Promise链,保证云函数等待异步操作完成后再向客户端返回结果
- 用
push替代concat构建数组,避免不必要的数组复制,提升性能 - 错误处理改为抛出
functions.https.HttpsError,这是onCall类型函数的标准错误返回方式,客户端可通过try/catch捕获并处理异常
Flutter代码优化(可选)
可以将Flutter代码改为更简洁的async/await写法,避免嵌套链式调用:
Future<void> listHouses() async { try { final parameters = {"userID": "1"}; final getHouses = FirebaseFunctions.instance.httpsCallable("getHouses"); final response = await getHouses.call(parameters); print(response.data); } catch (e) { print("Error fetching houses: $e"); } }
内容的提问来源于stack exchange,提问作者Pablo González Sánchez
相关产品推荐
相关产品推荐

