Next.js中.env.local环境变量无法访问返回undefined问题求助
解决Next.js环境变量在独立Node脚本中返回undefined的问题
问题根源
你直接用ts-node --esm db/index.ts运行脚本时,绕开了Next.js的环境变量加载流程。Next.js的.env.local变量注入只在它自身的构建、开发服务器或next run命令触发的脚本中生效,独立用ts-node运行Node脚本时,Node不会自动读取.env文件,自然拿不到变量。
解决方案
方案1:手动用dotenv加载.env文件
Node本身没有内置读取.env文件的能力,需要借助dotenv包手动加载:
- 安装dotenv依赖:
npm install dotenv --save-dev - 在
db/index.ts顶部添加加载代码:import dotenv from 'dotenv'; import path from 'path'; // 加载项目根目录的.env.local文件 dotenv.config({ path: path.join(process.cwd(), '.env.local') }); // 之后再打印变量 console.log(process.env.ENV_VAR); console.log(process.env.NEXT_PUBLIC_ENV_VAR); - 重新运行脚本:
ts-node --esm db/index.ts
方案2:用Next.js的next run命令运行脚本
Next.js提供了next run命令,可以自动加载项目的环境变量,无需额外配置:
- 在
package.json的scripts中添加:"scripts": { "db-script": "next run db/index.ts" } - 运行脚本:
这种方式下,不管变量有没有npm run db-scriptNEXT_PUBLIC_前缀,服务器端脚本都能正常访问。
额外检查项
- 确认
.env.local文件确实在项目根目录(root/.env.local),路径不能错 - 变量定义不要有多余空格,比如
ENV_VAR= test(等号后有空格)会导致变量值带空格,甚至读取失败 - 修改
.env.local后必须重启脚本,因为环境变量只会在脚本启动时加载一次
内容的提问来源于stack exchange,提问作者letmeeatbrioche
相关产品推荐
相关产品推荐

