Next.js自定义HTTPS服务器无法读取.env.local环境变量求助
Next.js 自定义HTTPS服务器读取.env.local环境变量问题解决方法
问题核心
直接用node server.js启动自定义服务器时,Next.js的环境变量加载逻辑是在app.prepare()执行后才完成的,所以初始化next实例时,process.env中的变量还未被注入,导致读取结果为undefined。
解决方案
方法一:手动加载dotenv(最直接有效)
Next.js依赖dotenv处理环境变量,但直接用node启动时不会自动加载,需要手动引入:
- 安装dotenv依赖
npm install dotenv --save-dev
- 在
server.js最顶部添加加载代码
require('dotenv').config({ path: '.env.local' });
- 修改
server.js中的变量读取逻辑(服务端变量无需加NEXT_PUBLIC前缀)
const port = process.env.PORT || 12345; // 增加默认值避免配置缺失报错 const domain = process.env.DOMAIN || "localhost"; const dev = process.env.NODE_ENV !== 'production'; // 从环境变量判断开发/生产模式
修改后的完整server.js示例:
require('dotenv').config({ path: '.env.local' }); const { createServer } = require("https"); const { parse } = require("url"); const next = require("next"); const fs = require("fs"); const port = process.env.PORT || 12345; const domain = process.env.DOMAIN || "localhost"; const dev = process.env.NODE_ENV !== 'production'; const app = next({ dev, domain, port }); const handle = app.getRequestHandler(); const httpsOptions = { key: fs.readFileSync("./certificate/test.key"), cert: fs.readFileSync("./certificate/test.crt"), }; app.prepare().then(() => { createServer(httpsOptions, async (req, res) => { const parsedUrl = parse(req.url, true); handle(req, res, parsedUrl); }).listen(port, (err) => { if (err) throw err; console.log(`> HTTPS: Ready on https://${domain}:${port}`); }); });
方法二:通过启动脚本注入环境变量
修改package.json的dev脚本,用dotenv/config预加载环境变量:
{ "scripts": { "dev": "NODE_ENV=development node -r dotenv/config server.js", "build": "next build", "start": "next start -p 15100", "lint": "next lint" } }
注:Windows系统需将脚本改为
"dev": "set NODE_ENV=development && node -r dotenv/config server.js"
注意事项
.env.local需放在项目根目录,确保dotenv能正确读取- 服务端代码中的环境变量无需添加
NEXT_PUBLIC前缀,该前缀仅用于需要暴露给客户端浏览器的变量 - 给环境变量设置默认值,避免因配置文件缺失导致启动失败
内容的提问来源于stack exchange,提问作者nougat
相关产品推荐
相关产品推荐

