React应用使用Google Sheets作为CMS时,dotenv配置PRIVATE_KEY引发TypeError问题求助
解决React中使用dotenv加载Google私钥的TypeError问题
这个错误的根源很明确:你在.env文件中用\n表示换行,但React的dotenv并没有把这些\n解析成实际的换行符,导致私钥的格式不符合PEM规范,最终在fixproc.js的正则匹配环节失败(match2为null,所以访问match2[2]时抛出Cannot read property '2' of null)。
而你硬编码私钥时正常,是因为JavaScript会自动把字符串里的\n解析为真实换行,私钥格式完全符合要求。
两种可行的解决方案:
方案1:在.env文件中使用真实换行(推荐)
dotenv支持多行环境变量,只要用双引号包裹私钥,直接换行书写即可:
REACT_APP_PRIVATE_KEY="-----BEGIN PRIVATE KEY----- ********* -----END PRIVATE KEY-----"
注意:确保私钥的每一行都和你从Google开发者控制台复制的完全一致,不要添加多余的空格或转义字符。
方案2:在代码中手动转换换行符
如果你不想修改.env文件,可以在使用私钥时,把字符串中的\n替换为真实的换行符:
const handleSubmit=async (e)=>{ const doc =new GoogleSpreadsheet(process.env.REACT_APP_SHEET_ID); console.log(process.env.REACT_APP_PRIVATE_KEY) console.log(process.env.REACT_APP_CLIENT_EMAIL) await doc.useServiceAccountAuth({ client_email:process.env.REACT_APP_CLIENT_EMAIL, // 手动替换转义的换行符 private_key: process.env.REACT_APP_PRIVATE_KEY.replace(/\\n/g, '\n') }); await doc.loadInfo(); const sheet = doc.sheetsByIndex[0]; await sheet.addRow({Website:website,Password:password}) window.location.reload(); }
验证思路
不管用哪种方案,最终要确保process.env.REACT_APP_PRIVATE_KEY输出的是带有真实换行的PEM格式私钥,而不是包含\n字符串的单行文本。你可以通过console.log输出后查看格式是否正确——正确的私钥应该是分多行显示的,和你硬编码的内容完全一致。
内容的提问来源于stack exchange,提问作者tanmya
相关产品推荐
相关产品推荐

