Heroku部署Node.js应用遇Firebase无效凭证/ENAMETOOLONG错误求助
错误根因
Firebase Admin SDK 的 cert() 方法支持两类入参:
- 本地服务账号JSON文件的路径字符串
- 直接传入解析完成的服务账号配置JS对象
你的代码中将拼接好的配置对象通过JSON.stringify()转成了长字符串,SDK会误认为这是文件路径尝试读取,才会抛出ENAMETOOLONG: name too long的文件名过长错误。
修复后代码
const fireBaseAdmin = require('firebase-admin'); // 原判断逻辑错误,require引入的firebase-admin只要依赖安装正常就不会为空,改为校验必要环境变量 const requiredEnvVars = [ 'FIREBASE_TYPE', 'FIREBASE_PROJECT_ID', 'FIREBASE_PRIVATE_KEY_ID', 'FIREBASE_PRIVATE_KEY', 'FIREBASE_CLIENT_EMAIL', 'FIREBASE_CLIENT_ID', 'FIREBASE_AUTH_URI', 'FIREBASE_TOKEN_URI', 'FIREBASE_AUTH_PROVIDER', 'FIREBASE_CLIENT' ]; const missingVars = requiredEnvVars.filter(varName => !process.env[varName]); if (missingVars.length > 0) { throw new Error(`缺失必要环境变量: ${missingVars.join(', ')}`); } fireBaseAdmin.initializeApp({ // 去掉JSON.stringify,直接传入JS对象即可 credential: fireBaseAdmin.credential.cert({ type: process.env.FIREBASE_TYPE, project_id: process.env.FIREBASE_PROJECT_ID, private_key_id: process.env.FIREBASE_PRIVATE_KEY_ID, private_key: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n'), client_email: process.env.FIREBASE_CLIENT_EMAIL, client_id: process.env.FIREBASE_CLIENT_ID, auth_uri: process.env.FIREBASE_AUTH_URI, token_uri: process.env.FIREBASE_TOKEN_URI, auth_provider_x509_cert_url: process.env.FIREBASE_AUTH_PROVIDER, client_x509_cert_url: process.env.FIREBASE_CLIENT }) }); module.exports = fireBaseAdmin;
额外检查项
- 检查Heroku Config Vars中
FIREBASE_AUTH_PROVIDER的值,错误日志里该字段值为ttps://www.googleapis.com/oauth2/v1/certs,缺失了开头的h,会导致后续鉴权失败。 - 确认
FIREBASE_PRIVATE_KEY在Heroku配置中没有额外包裹引号,直接粘贴原始私钥内容即可。
内容的提问来源于stack exchange,提问作者golembeskia
相关产品推荐
相关产品推荐

