部署Firebase集成Stripe云函数报错:用户代码加载失败
Firebase云函数报「加载用户代码失败」排查方案
你当前遇到的Function failed on loading user code报错发生在函数冷启动加载阶段,和CORS问题无关——代码还没走到请求处理逻辑就已经崩溃了,核心问题和修复方式如下:
已定位的代码问题
- 模块语法混用:同时使用CommonJS规范的
require()引入依赖、ES Module规范的export导出函数,Node.js运行时加载文件时会直接抛出语法错误,直接导致加载失败 - 顶层初始化风险:在代码顶层直接读取
functions.config().stripe.secret_key初始化Stripe,如果部署前没有提前配置Stripe密钥的环境变量,这里会读取到undefined,Stripe实例初始化失败直接中断加载流程 - SDK写法过时:
admin.initializeApp(functions.config().firebase)是旧版Firebase Admin SDK的初始化写法,新版SDK不需要传入该参数,错误传参可能触发初始化异常 - 语法兼容问题:如果是纯JavaScript项目,直接写
data: any, context: any的TypeScript类型标注会触发语法错误;如果是TS项目,需要确保编译配置正常,部署时会自动编译TS代码 - 逻辑隐患:直接把整个
data对象传给Stripe的product_data.name字段(要求字符串类型)、1.99 * 100存在浮点数精度问题(计算结果不是整数,Stripe要求金额为最小货币单位的整数值),这两个问题会在函数执行阶段触发报错,不会导致加载失败
修复后可直接部署的代码
const functions = require("firebase-functions"); const admin = require("firebase-admin"); let stripe; // 加判空避免顶层初始化崩溃 if (functions.config().stripe?.secret_key) { stripe = require("stripe")(functions.config().stripe.secret_key); } // 新版Admin SDK默认初始化即可 admin.initializeApp(); // 统一使用CommonJS规范导出,和require语法保持一致 exports.createCheckoutSessionGreen = functions.region("europe-west6") .https.onCall(async (data, context) => { // 前置参数校验 if (!stripe) { throw new functions.https.HttpsError('failed-precondition', 'Stripe密钥未完成配置'); } if (typeof data?.productName !== 'string') { throw new functions.https.HttpsError('invalid-argument', '商品名称参数不合法'); } const session = await stripe.checkout.sessions.create({ payment_method_types: ["card"], mode: "payment", // 注意:线上正式环境请替换为生产域名地址,localhost仅本地调试可用 success_url: "http://localhost:8100/tabs/types/song", cancel_url: "http://localhost:8100/tabs/types/song", line_items: [ { price_data: { currency: "eur", product_data: { name: data.productName, }, // 取整避免浮点数精度问题,符合Stripe整数传参要求 unit_amount: Math.round(1.99 * 100), }, quantity: 1, }, ], }); return session.id; });
部署前操作步骤
- 先配置Stripe密钥到Firebase环境变量,在项目根目录执行命令:
firebase functions:config:set stripe.secret_key="你的Stripe密钥" - 如果要使用TypeScript,确保初始化functions时选择了TS模板,TS代码存放在
src目录下,部署流程会自动完成编译,不要在纯JS文件中写TS类型标注 - 配置完成后重新执行
firebase deploy --only functions即可 - 部署成功后如果调用时出现CORS报错,检查前端初始化Firebase的区域配置是否和函数部署区域
europe-west6一致,onCall类型函数会自动处理CORS响应头,不需要手动添加跨域配置
内容的提问来源于stack exchange,提问作者sirss
相关产品推荐
相关产品推荐

