Firebase Cloud Functions的onCall中执行http.get获取邮编供Flutter调用的代码问题
代码存在的核心问题
- 异步逻辑未等待执行:你使用回调式的
http.get没有做Promise封装,async函数没有等待请求完成就直接结束,云函数会提前回收资源,最终返回空值或者超时。同时res.end回调里的返回值只会作用于回调本身,无法传递给云函数的外层返回。 - 变量命名冲突:云函数入参已经命名为
data,你在函数内部又定义了var data = [],会直接覆盖入参,后续要取入参里的邮编参数(data.text)时会读取失败。 - 错误没有向上抛出:当前错误只做了本地打印,没有返回给调用方,Flutter端无法感知请求失败的原因。
- 硬编码了测试邮编:注释掉了动态拼接邮编的逻辑,固定写死了
100-0002,无法根据传入参数查询不同邮编。
修正后的云函数代码
const functions = require("firebase-functions"); const admin = require('firebase-admin'); const http = require('https'); admin.initializeApp(); // 把回调式的http.get封装成Promise方便async/await调用 function httpGet(url) { return new Promise((resolve, reject) => { http.get(url, (res) => { let body = ''; res.setEncoding('utf8'); res.on('data', (chunk) => body += chunk); res.on('end', () => resolve(body)); }).on('error', (e) => reject(e)); }); } exports.postalCode = functions.https.onCall(async (data, context) => { // 校验入参 if (!data.text) { throw new functions.https.HttpsError('invalid-argument', '缺少邮编参数text'); } const URL = `https://zipcloud.ibsnet.co.jp/api/search?zipcode=${encodeURIComponent(data.text)}`; try { const result = await httpGet(URL); // 解析为JSON后返回,方便Flutter端直接处理 return JSON.parse(result); } catch (e) { console.error('请求失败:', e.message); throw new functions.https.HttpsError('internal', '查询邮编失败', e.message); } });
Flutter端调用示例
首先需要在Flutter项目中引入cloud_functions依赖,调用代码参考如下:
import 'package:cloud_functions/cloud_functions.dart'; Future<Map?> queryPostalCode(String zipCode) async { try { final result = await FirebaseFunctions.instance .httpsCallable('postalCode') .call({'text': zipCode}); return result.data as Map; } on FirebaseFunctionsException catch (e) { print('调用失败: ${e.code} ${e.message}'); return null; } }
内容的提问来源于stack exchange,提问作者Masaru Nagaya
相关产品推荐
相关产品推荐

