React Native调用Firebase云函数报Response is not valid JSON object错误
错误原因
- 核心原因1:区域不匹配:你的云函数部署在
europe-west1区域,但React Native端初始化Firebase Functions时默认使用us-central1区域,请求发送到了不存在的函数地址,返回的错误页面不是合法JSON结构,触发报错。 - 次要原因2:可调用云函数(
https.onCall)会自动序列化返回的JS对象,手动调用JSON.stringify会返回纯字符串,不符合客户端SDK期望的响应格式。 - 额外问题:未做登录态判断,未登录用户调用时
context.auth为undefined,会触发云函数内部报错,返回的错误响应也可能不符合格式要求。
修复步骤
1. 修正Firebase云函数代码
直接返回JS对象即可,同时添加登录态校验:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); exports.bfs = functions.region("europe-west1").https.onCall((data, context) => { // 登录态校验 if (!context.auth) { throw new functions.https.HttpsError('unauthenticated', '需要登录后调用'); } const steps = data.steps; const uid = context.auth.uid; // 直接返回对象,无需手动序列化 return { steps, uid }; });
修改后重新部署:firebase deploy --only functions:bfs
2. 修正React Native端调用代码
初始化Functions时指定和云函数一致的区域,同时正确读取返回结果、添加错误捕获:
import "firebase/functions"; import firebase from "firebase"; // 避免重复初始化Firebase if (!firebase.apps.length) { firebase.initializeApp(firebaseConfig); } // 初始化时指定部署云函数的区域 const functions = firebase.functions('europe-west1'); const bfs = functions.httpsCallable("bfs"); bfs({ steps: 1 }) .then((result) => { // 响应数据存放在result.data属性中 console.log(result.data); }) .catch((error) => { // 捕获错误避免未处理的Promise rejection console.error("调用失败:", error.code, error.message); });
内容的提问来源于stack exchange,提问作者lfranceschetti
相关产品推荐
相关产品推荐

