我在应用程序中使用了.env个变量.js文件来访问密钥.在我下载新的Firebase Service Account Private Key之前,一切都很顺利.当我用新值替换旧值时,我无法再访问密钥,因为在terminal中,当我运行node app.js时,我不断收到一条错误消息:

/用户/Cpu/桌面//node_modules/firebase admin/lib/auth/credential.js:129

错误:无法分析私钥:错误:PEM格式无效

我所做的只是c+p新的Private Key,然后添加它并保存.env文件,推送到heroku,它不再工作了.我甚至下载了一个新的Private Key,但同样的问题也发生了.

新旧私钥

// old Private Key
-----BEGIN PRIVATE KEY-----\nbbbbbbbb\n-----END PRIVATE KEY-----\n

// new Private Key
-----BEGIN PRIVATE KEY-----\nzzzzzzzz\n-----END PRIVATE KEY-----\n

这个环境文件:

FIREBASE_PROJECT_ID=wwwwwwww
FIREBASE_CLIENT_EMAIL=xxxxxxxx
FIREBASE_DATABASE_URL=yyyyyyyy
FIREBASE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\nzzzzzzzz\n-----END PRIVATE KEY-----\n

应用程序.js文件:

const dotenv = require('dotenv');
dotenv.load();

var admin = require("firebase-admin");
admin.initializeApp({
  credential: admin.credential.cert({
      projectId: process.env.FIREBASE_PROJECT_ID,   // I get no error here
      clientEmail: process.env.FIREBASE_CLIENT_EMAIL,   // I get no error here
      privateKey: process.env.FIREBASE_PRIVATE_KEY   // I get error HERE
  }),
  databaseURL: process.env.FIREBASE_DATABASE_URL
});

How can I fix this issue?

推荐答案

问题是,因为我在.env文件中使用了dotenv个变量,FIREBASE_PRIVATE_KEY个有转义字符:其中\n个.

我必须跟随this answer并在其末尾附加.replace(/\\n/g, '\n')来解析它:

privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n')

现在代码看起来是这样的:

admin.initializeApp({
  credential: admin.credential.cert({
      projectId: process.env.FIREBASE_PROJECT_ID, // I get no error here
      clientEmail: process.env.FIREBASE_CLIENT_EMAIL, // I get no error here
      privateKey: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, '\n') // NOW THIS WORKS!!!
  }),
  databaseURL: process.env.FIREBASE_DATABASE_URL
});

Node.js相关问答推荐

为什么在导出的函数中调用node-sqlite3中的数据库方法时不起作用?

findoneandupdate()方法更新数据库,但其响应在请求中返回为null

使用参考中断Mongoose模型-Node.js

EJS ForEach循环标记

找不到 vue-template-compiler@2.6.14 的匹配版本 | Shopware 6.5 更新后的 node 问题

无法使用 Express 设置会话 cookie 的过期日期

我如何在nodejs中的路由之间交换令牌

TypeScript Eslint警告了一个AWS客户端构造函数(dynamodb),但没有警告另一个(s3)

AWS ECS 服务发现 Cors 问题?

为什么这个 module.export 函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作

'{ id: string; 类型的参数}' 不可分配给FindOneOptions类型的参数

从 Node.js 应用程序查询 Heroku 托管的 Postgres 数据库时出现自签名证书错误

Sequelize 基于关联的查找

在 express 中添加故意延迟

chart.js 无法创建图表:无法从给定项目获取上下文

需要 node-gyp 的 npm install 在 Windows 上失败

Mongoose - 保存字符串数组

Javascript在try块内设置const变量

NodeJS 中的 HTTPS 请求

如何在 express/node js 中发送错误 http 响应?