T3 App环境变量无效排查:process.env仅NODE_ENV有值
T3-App环境变量加载失败排查方案
检查.env文件的位置与命名
确保.env(本地开发推荐用.env.local,避免提交到Git)放在项目根目录,和package.json、next.config.js同级,别放在src或其他子文件夹里。重启开发服务器
修改.env文件后,Next.js不会自动重载环境变量,必须完全停止当前dev服务(Ctrl+C),再重新运行npm run dev或pnpm dev。检查.env文件的语法正确性
- 变量名不能带空格,比如要写
DATABASE_URL=xxx,不是DATABASE_URL = xxx - 如果变量值包含特殊字符(比如URL里的
@、&,或者空格),必须用双引号包裹,示例:DATABASE_URL="postgres://user:password@localhost:5432/mydb" NEXTAUTH_URL="http://localhost:3000" - 变量值前后别加多余空格,比如
NEXTAUTH_SECRET= abc123会让值带空格,可能触发验证错误。
- 变量名不能带空格,比如要写
确认环境文件与NODE_ENV匹配
Next.js会根据NODE_ENV加载对应配置文件:- 开发环境(NODE_ENV=development)加载
.env+.env.development - 生产环境(NODE_ENV=production)加载
.env+.env.production
如果变量写在了错误的环境文件里(比如开发时用了.env.production),就会加载不到。
- 开发环境(NODE_ENV=development)加载
补全T3的环境变量验证逻辑
你当前的代码只是把process.env变量赋值给serverEnv,但没执行zod的验证解析,完整逻辑应该是用parse方法校验:import { z } from "zod"; export const serverSchema = z.object({ DATABASE_URL: z.string().url(), NODE_ENV: z.enum(["development", "test", "production"]), NEXTAUTH_SECRET: z.string(), NEXTAUTH_URL: z.preprocess( (str) => process.env.VERCEL_URL ?? str, process.env.VERCEL ? z.string() : z.string().url(), ), GOOGLE_CLIENT_ID: z.string(), GOOGLE_CLIENT_SECRET: z.string(), STRIPE_SECRET_KEY: z.string(), }); // 用zod解析验证,确保变量符合规则 export const serverEnv = serverSchema.parse({ DATABASE_URL: process.env.DATABASE_URL, NODE_ENV: process.env.NODE_ENV, NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET, GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET, NEXTAUTH_URL: process.env.NEXTAUTH_URL, STRIPE_SECRET_KEY: process.env.STRIPE_SECRET_KEY, });缺少
parse步骤的话,即使变量加载成功,也可能因为未校验而抛出错误。排查文件权限与Git忽略规则
确保.env文件有读取权限,同时检查.gitignore是否意外屏蔽了该文件(这不会影响本地加载,但如果是部署环境要注意)。
内容的提问来源于stack exchange,提问作者Ygbh
相关产品推荐
相关产品推荐

