如何通过环境变量而非密钥文件连接Google Cloud Firestore
Vercel 部署 Next.js 无服务器函数连接 Firestore 无本地密钥文件初始化方案
@google-cloud/firestore SDK 本身就支持直接传入凭证参数初始化,根本不需要用keyFilename指定本地密钥文件,完全适配Vercel的环境变量配置方式,直接按下面的方法配置就行:
配置环境变量
去Vercel项目的环境变量设置页,加三个变量,值直接从你已经拿到的服务账号JSON密钥里复制对应字段就行:
GOOGLE_PROJECT_ID:填GCP项目ID,对应密钥文件里的project_idGOOGLE_CLIENT_EMAIL:填服务账号邮箱,对应密钥文件里的client_email,一般格式是xxx@你的项目ID.iam.gserviceaccount.comGOOGLE_PRIVATE_KEY:填服务账号私钥,对应密钥文件里的private_key,一定要完整复制,包括首尾的-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----,别漏内容
本地开发的时候把这三个变量写到项目根目录的.env.local里就行,记得把.env.local加到.gitignore,别把密钥提交到代码仓库。
初始化代码
把官方示例里的keyFilename参数删掉,换成credentials字段直接传环境变量里读出来的凭证就行,注意要处理下私钥的换行符转义问题,不然很容易报鉴权错:
const Firestore = require('@google-cloud/firestore'); const firestore = new Firestore({ projectId: process.env.GOOGLE_PROJECT_ID, credentials: { client_email: process.env.GOOGLE_CLIENT_EMAIL, // 把环境变量里被转义的换行符还原 private_key: process.env.GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n'), }, });
踩坑提醒
- 服务账号别给太高权限,按最小权限原则配,业务只需要读写Firestore就只给对应的Firestore权限,别直接绑项目所有者角色,避免安全问题
- 上面的代码是给跑在Node.js Runtime下的无服务器函数用的,如果用Edge Runtime,这个SDK适配不好,建议换适配Edge的Firebase Web SDK来连
- 要是部署完报鉴权错误,先查三个点:Vercel里的环境变量有没有正确注入到生产环境、服务账号有没有开Firestore的访问权限、私钥的换行符替换逻辑有没有写对
内容的提问来源于stack exchange,提问作者André Chalella
相关产品推荐
相关产品推荐

