Node/Express+React+Firebase Firestore操作失败报错求助
我来帮你拆解下当前遇到的问题,核心其实是两个关键点:Firebase服务端密钥的PEM格式配置错误,以及异步数据库操作的错误捕获逻辑有漏洞,一步步来解决:
1. 先搞定PEM密钥报错问题
这个error:0906D06C:PEM routines:PEM_read_bio:no start line报错几乎都是Firebase服务账号密钥出了问题,你可以从这几个方向排查:
重新获取正确的密钥文件:
去Firebase控制台的「项目设置」→「服务账号」页面,重新下载完整的服务账号密钥JSON文件,绝对不要手动修改文件里的内容,尤其是private_key字段——它必须包含首尾的-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----行,中间的密钥内容也不能有多余空格或换行错误。检查config.js里的Admin初始化逻辑:
你没贴这部分代码,但这是核心环节。确保你用密钥正确初始化了Firebase Admin,示例代码应该是这样的:const admin = require('firebase-admin'); // 注意路径要和你下载的密钥文件完全匹配,别写错层级 const serviceAccount = require('./serviceAccountKey.json'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: 'https://你的项目ID.firebaseio.com' // 替换成你的实际数据库URL }); const db = admin.firestore(); module.exports = { db };如果是用环境变量存储密钥内容(比如把
private_key放到.env里),一定要把整个密钥字符串用双引号括起来,并且把原始的换行替换成\n,不然Node读取时会解析出错。
2. 修复异步操作的错误捕获
你的createAsin函数里,collection.add()是异步Promise,但你用了try/catch却没加await,这会导致Promise的rejection无法被catch捕获,不仅抛出UnhandledPromiseRejectionWarning,还会让你看不到数据库操作的真实错误信息。
修改后的代码应该是这样的:
const admin = require('firebase-admin') const config = require('./config.js') // 给函数加上async关键字 exports.createAsin = async p => { try { // 给add()加上await,等待异步操作完成 let docRef = await config.db.collection('asins').add({ uid: p.uid, asin: p.asin, mapPrice: p.mapPrice, data: [] }) console.log('db: ASIN created with ID', docRef.id) // 打印文档ID确认操作成功 return p } catch (e) { console.log('db: error creating ASIN /', e) return null } }
这样修改后,数据库操作的错误会被正确捕获并打印,你也能更精准定位问题,同时避免了未处理的Promise拒绝警告。
3. 环境版本的小建议
你的npm(6.9.0)和Node(v11.8.0)版本都比较老旧了,虽然这不是直接导致问题的原因,但旧版本可能存在一些兼容性坑,建议升级到Node的LTS版本(比如v18或v20),配套的npm版本也会同步更新,能减少很多潜在问题。
按照上面的步骤排查后,应该就能解决数据不显示和PEM错误的问题了。
内容的提问来源于stack exchange,提问作者blrsk

