You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:36:03