.env.local定义环境变量后process.env调用不生效如何解决
问题
我已在.env.local文件中定义了相关密钥,但调用process.env.API_KEY时无法获取预期值,功能未正常生效。
已配置的.env.local内容:
API_KEY=xx_xxxxxxxxxxxx DATABASE_URL=https://xxxxx/db/main
调用环境变量的代码:
export const xata = new BaseClient({ apiKey: process.env.API_KEY, databaseURL: process.env.DATABASE_URL });
当前项目目录结构:
Project ├─ pages ├─ public ├─ .env.local └─ helper # 存放需调用api key的文件的目录
排查&解决步骤
- 先确认框架类型:从
pages目录和.env.local的命名规则判断大概率是Next.js项目,如果是其他Node.js框架,本身不会自动加载.env.local文件,需要手动安装dotenv依赖:执行npm i dotenv,在项目入口文件最顶部添加如下代码手动加载:require('dotenv').config({ path: '.env.local' }) - Next.js项目环境变量有权限区分:服务端运行的代码可以直接读取不带前缀的私有环境变量,但是如果
helper目录下的代码会被打包到客户端(浏览器侧)运行,默认无法读取不带前缀的变量,必须给变量名加NEXT_PUBLIC_前缀才能被客户端识别。修改.env.local里的变量名:
同步修改代码里的引用:NEXT_PUBLIC_API_KEY=xx_xxxxxxxxxxxx NEXT_PUBLIC_DATABASE_URL=https://xxxxx/db/mainexport const xata = new BaseClient({ apiKey: process.env.NEXT_PUBLIC_API_KEY, databaseURL: process.env.NEXT_PUBLIC_DATABASE_URL }); - 检查文件位置和命名:
.env.local必须放在项目根目录(和package.json同级),从贴出的结构看位置没问题,但要注意Windows系统默认会隐藏文件扩展名,别把文件存成.env.local.txt这类带隐藏后缀的格式,否则框架识别不到。 - 修改环境变量后必须重启开发服务:环境变量是在Node服务启动时一次性加载的,热更新不会同步新修改的环境变量,停掉当前运行的dev进程,重新执行启动命令即可。
- 最后排查拼写问题:可以在代码里加一句
console.log(process.env)打印所有已加载的环境变量,确认有没有变量名拼写错误、值前后多加了空格、错误加了引号导致值不符合预期的问题——.env文件里普通字符串不需要额外加引号,加了的话引号会被当成值的一部分读取。
内容的提问来源于stack exchange,提问作者Sai Krishnadas
相关产品推荐
相关产品推荐

