Vercel部署Next.js时找不到根目录google-cloud-key.json如何解决?
问题根因
Vercel 部署 Next.js 项目时,Serverless 函数的运行目录结构和本地开发环境完全不同,且 Next.js 构建时默认只会打包必要的代码依赖,不会自动包含根目录的 google-cloud-key.json 文件,所以直接通过相对路径、__dirname 拼接路径都无法正确找到文件。
解决方案
方案一:环境变量传递密钥(推荐)
该方案无需读取本地文件,安全性更高,也是 Vercel 官方推荐的敏感信息存储方案。
- 复制
google-cloud-key.json完整内容,在 Vercel 项目后台的环境变量配置页,新增服务端环境变量GOOGLE_CLOUD_KEY_CONTENT,值为复制的JSON内容,确保该变量不暴露给客户端。 - 本地开发时在项目根目录的
.env.local文件中添加同样的变量配置,且将.env.local加入.gitignore避免提交到仓库。 - 修改代码直接使用
credentials参数初始化客户端,无需读取文件:
const storage = new Storage({ projectId: 'careful-relic-319511', credentials: JSON.parse(process.env.GOOGLE_CLOUD_KEY_CONTENT) });
方案二:配置文件打包规则
如果坚持使用密钥文件读取的方式,可以通过配置让 Next.js 构建时把密钥文件纳入打包产物:
- 在项目根目录的
next.config.js中添加以下配置,指定构建时包含根目录的密钥文件:
/** @type {import('next').NextConfig} */ const nextConfig = { experimental: { outputFileTracingIncludes: { '/api/**/*': ['./google-cloud-key.json'], }, }, } module.exports = nextConfig
- 修改文件路径拼接逻辑,使用
process.cwd()(Vercel 运行时该值指向项目构建后的根目录/var/task)拼接路径:
const path = require('path') const storage = new Storage({ projectId: 'careful-relic-319511', keyFilename: path.join(process.cwd(), 'google-cloud-key.json') });
注意:该方案需要确保密钥文件不会被提交到公开仓库,避免敏感信息泄漏。
内容的提问来源于stack exchange,提问作者Haren Sarma
相关产品推荐
相关产品推荐

