React Native新项目调用Firebase云函数返回"internal"错误且无日志的问题排查求助
React Native新项目调用Firebase云函数返回"internal"错误且无日志的问题排查求助
各位好,最近在迁移React Native项目到新工程后,碰到了一个百思不得其解的Firebase云函数问题,想请教下大家的思路:
问题概述
我基于Firebase开发的React Native项目,在迁移代码到全新的RN工程后,所有Cloud Function的调用都会返回**"internal"**错误。更奇怪的是,这些请求似乎根本没有到达云函数——Google Cloud的Log Explorer里完全找不到对应的请求日志。
但在旧的RN项目里,完全相同的云函数调用是正常工作的。我甚至在新项目里测试了最简单的helloWorld云函数,结果还是一样的internal错误。不管用Cloud Functions v1还是v2,问题都存在;我还专门新建了一个Firebase项目,部署了同样的云函数,从新RN项目调用依然报同样的错。
已做的排查与测试
我已经做了不少排查,目前得到的信息如下:
- 模拟器测试正常:在Firebase Emulator中调用云函数,完全可以正常工作,模拟器日志显示验证通过:
{ "verifications": { "app": "MISSING", "auth": "VALID" }, "logging.googleapis.com/labels": { "firebase-log-type": "callable-request-verification" }, "severity": "DEBUG", "message": "Callable request verification passed" } - 配置与区域确认:
- 确认
firebaseConfig的所有参数都是正确的,指向目标Firebase项目 - 云函数部署在
us-central1区域,客户端初始化functions时也指定了同一个区域,没有区域不匹配的问题 - 两个Firebase项目(原项目和新项目)都没有启用App Check
- 确认
- 排除函数自身问题:云函数的逻辑在模拟器中完全正常,说明函数代码本身没有问题
相关代码片段
客户端Firebase初始化配置(firebaseConfig.js)
// firebaseConfig.js import { initializeApp } from "firebase/app"; import { getFirestore } from "firebase/firestore"; import { getStorage } from "firebase/storage"; import { getFunctions } from "firebase/functions"; import { initializeAuth, getReactNativePersistence } from "firebase/auth"; import ReactNativeAsyncStorage from "@react-native-async-storage/async-storage"; const firebaseConfig = { ... }; // 已确认配置参数完全正确 const app = initializeApp(firebaseConfig); const auth = initializeAuth(app, { persistence: getReactNativePersistence(ReactNativeAsyncStorage), }); const db = getFirestore(app); const storage = getStorage(app); const functions = getFunctions(app, 'us-central1'); export { app, auth, db, storage, functions };
云函数代码(v2 onCall)
const { setGlobalOptions } = require("firebase-functions"); const { onCall, HttpsError } = require("firebase-functions/v2/https"); const admin = require("firebase-admin"); admin.initializeApp(); setGlobalOptions({ maxInstances: 10 }); exports.setUserRole = onCall(async (request) => { const { uid, role } = request.data; if (!uid) { throw new HttpsError("invalid-argument", "UID cannot be empty."); } if (!request.auth || request.auth.token.role !== "admin") { throw new HttpsError("permission-denied", "Unauthorized action."); } if (!["admin", "user"].includes(role)) { throw new HttpsError("invalid-argument", "Invalid role."); } try { await admin.auth().setCustomUserClaims(uid, { role }); return { success: true }; } catch (error) { console.error("Role update error:", error); throw error; } });
客户端调用云函数的代码
import { functions } from '../config/firebaseConfig'; import { httpsCallable } from 'firebase/functions'; const handleChangeRole = async (userId: string, currentRole: string) => { try { const setUserRole = httpsCallable(functions, 'setUserRole'); await setUserRole({ uid: "MdCccwMtwfOJmgbm5mVvbOwFOJD3", role: "admin" }); Alert.alert('Success', `Role updated to "admin".`); } catch (error) { console.error('Role change error:', error); Alert.alert('Error', 'Role could not be changed.'); } };
困惑与求助方向
现在我完全搞不懂问题出在哪里:模拟器正常,说明函数逻辑和客户端调用代码没问题;但生产环境里请求根本没到达云函数,日志都没有。
有没有朋友遇到过类似的情况?可能的原因会是什么?比如React Native项目的依赖版本问题?Firebase SDK初始化时有没有什么容易忽略的细节?或者有没有什么调试方法可以追踪到请求到底卡在了哪个环节?
非常感谢大家的帮忙!
内容来源于stack exchange
相关产品推荐
相关产品推荐

