Jus*_*ice 4 parsing environment-variables multiline node.js firebase-admin
firebaseapperror: failed to parse private key: error: invalid pem formatted message当我将 Nodejs 应用程序推送到 Heroku 时,出现此错误。
我的环境变量都是这样设置的
# .env file
project_id=project_id
private_key='-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n'
client_email=client_email
Run Code Online (Sandbox Code Playgroud)
并像这样访问它们:
export const sa = {
privateKey: process.env.private_key,
projectId: process.env.project_id,
clientEmail: process.env.client_email
};
Run Code Online (Sandbox Code Playgroud)
在我的本地一切工作正常,但在生产(heroku)我得到了上面提到的错误。私钥是一个多行环境变量,无法解析。
请问我该如何解决这个问题?
Jus*_*ice 15
修复方法
我是如何解决这个问题的,是通过我在网上看到的一篇文章:How to Store a Long, Multi-line Private Key in an Environment Variable
按照步骤操作,您也应该修复此问题。
这篇文章的简短摘要是这样的:
将长的多行密钥存储为 json 字符串,如下所示:
# .env file
project_id=project_id
private_key='{"privateKey": "-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n"}'
client_email=client_email
Run Code Online (Sandbox Code Playgroud)
然后解析它并解构密钥,如下所示:
const { privateKey } = JSON.parse(process.env.private_key);
export const sa = {
privateKey,
projectId: process.env.project_id,
clientEmail: process.env.client_email
};
Run Code Online (Sandbox Code Playgroud)
这在本地可以工作,但在生产(heroku)上,你会得到一个解析错误,因为有问题的键之前和之后的单引号。因此,请删除生产环境变量中键前后的单引号。我也尝试过在本地不使用单引号,并且它有效。
额外优惠
这种方法的额外好处
由此,您甚至可以将整个环境变量存储为一个对象,如下所示
# .env file
sa='{"privateKey": "-----BEGIN PRIVATE KEY----- ... ------END PRIVATE KEY-----\n", "clientEmail": "client_email", "projectId": "project_id"}'
Run Code Online (Sandbox Code Playgroud)
然后像这样访问它:
export const sa = JSON.parse(process.env.sa);
Run Code Online (Sandbox Code Playgroud)
就是这样。
提醒:记住我所说的单引号!