Cloud Functions v2 TypeScript中Firebase参数化配置类型错误排查
问题
按照Firebase官方推荐的参数化配置方式,在functions目录的.env文件中定义LOCATION_FUNCTION=asia-northeast3,在index.ts中通过defineString获取该参数并设置为setGlobalOptions的region,但运行firebase functions:shell时出现错误:FirebaseError: Illegal type coercion of param LOCATION_FUNCTION to type string[],不清楚错误原因及修复方法。
相关代码及运行输出如下:
.env 文件
# .env # This file is located in functions folder. LOCATION_FUNCTION=asia-northeast3
index.ts 文件
// index.ts import {initializeApp} from "firebase-admin/app"; initializeApp(); import {defineString} from "firebase-functions/params"; const httpOrCallableFunctionRegion = defineString("LOCATION_FUNCTION"); import {setGlobalOptions} from "firebase-functions/v2"; setGlobalOptions({region: httpOrCallableFunctionRegion});
运行输出
/.nvm/versions/node/v18.16.0/bin/npm run shell > shell > npm run cleanup && npm run build && firebase functions:shell > cleanup > kill-port --port 5001 Could not kill process on port 5001. No process running on port. > build > tsc --noImplicitAny --strictNullChecks ✔ functions: Using node@18 from host. i functions: Loaded environment variables from .env. ⬢ functions: Failed to load function definition from source: FirebaseError: Illegal type coercion of param LOCATION_FUNCTION to type string[] i functions: Loaded functions: No functions emulated.
解决方法
错误根源是Firebase Functions v2的setGlobalOptions中,region参数支持string | string[]类型,而defineString返回的StringParam对象在赋值时,内部逻辑会尝试将其强制转换为数组类型,导致类型不匹配。
有两种修复方式:
获取参数实际字符串值
使用StringParam对象的value()方法提取实际字符串,再传入region:import {initializeApp} from "firebase-admin/app"; initializeApp(); import {defineString} from "firebase-functions/params"; const httpOrCallableFunctionRegion = defineString("LOCATION_FUNCTION"); import {setGlobalOptions} from "firebase-functions/v2"; setGlobalOptions({region: httpOrCallableFunctionRegion.value()});将参数包装为数组
若需兼容多区域配置场景,直接把参数包装成数组传入:import {initializeApp} from "firebase-admin/app"; initializeApp(); import {defineString} from "firebase-functions/params"; const httpOrCallableFunctionRegion = defineString("LOCATION_FUNCTION"); import {setGlobalOptions} from "firebase-functions/v2"; setGlobalOptions({region: [httpOrCallableFunctionRegion]});
两种方式均可解决类型转换问题,单区域配置推荐第一种,多区域扩展场景推荐第二种。
内容的提问来源于stack exchange,提问作者Jed Choi
相关产品推荐
相关产品推荐

