【发布时间】:2020-01-22 08:44:48
【问题描述】:
我正在开发标准的 Node+Express 网络应用。其他一切工作正常,但我无法使 .env 文件填充 process.env
起初,我认为这是一个范围问题,因为我的 app.js(其中调用了 dotenv)位于 src 子文件夹中,而 .env 位于根目录中。但是使用节点工具并使用名为find-config 的包确认它,我有正确的绝对路径。我从来没有因为找不到文件而收到 ENOENT。
我尝试了一切,从文档中解释的dotenv 的调试内容到我自己的调试,确保一切就绪。这是我最近的尝试:
const fs = require('fs');
const realpath = require('find-config')('.env');
console.log(dotenv.parse(fs.readFileSync(realpath)));
我已暂停执行并断言 realpath 确实是绝对的 .env 路径
这是.env
NODE_ENV=development
NODE_HOST=localhost
NODE_PORT=8080
SESSION_SECRET=eX&frsz9M*3XqFKUrK6
console.log 输出{},这与我尝试过的每条途径都是一致的:从来没有错误,也从来没有解析过的对象。只是虚无。
这样做:
const results = JSON.stringify(dotenv.config({"path":"/100%/correct/path/.env"}));
它会返回{"parsed":{}}
我变得非常怀疑,我下载、安装并运行了 29k 星的大型 Hackathon Starter 存储库,它使用 same method。
最初,它不起作用,因为作者使用了相对路径。使用绝对路径即可。
如果有帮助,请提供更多信息:
/* =========== Dotenv troubleshooting ===========
*/
const realPath = path.join(__dirname, '../.env');
const buffer = fs.readFileSync(realPath);
const envConfig = dotenv.parse(buffer, {debug:true});
l(realPath);
l(buffer);
l(envConfig);
/* end of Dotenv troubleshooting ------------------ */
这会记录以下内容:
> node server.js
SESSION_SECRET=blabla value when parsing line 1: NODE_ENV=development
19:06:11 info: /100%/correct/path/.env
19:06:11 info: <Buffer 4e 4f 44 45 5f 45 4e 56 3d 64 65 76 65 6c 6f 70 6d 65 6e 74 0d 4e 4f 44 45 5f 48 4f 53 54 3d 6c 6f 63 61 6c 68 6f 73 74 0d 4e 4f 44 45 5f 50 4f 52 54 ... 41 more bytes>
19:06:11 info: {}
如您所知,该缓冲区确实是文件:
/100%/correct/path $ xxd .env
00000000: 4e4f 4445 5f45 4e56 3d64 6576 656c 6f70 NODE_ENV=develop
00000010: 6d65 6e74 0d4e 4f44 455f 484f 5354 3d6c ment.NODE_HOST=l
【问题讨论】:
-
您能检查
.env文件的访问权限吗?我的意思是我没有看到代码有问题,也许.env文件在创建时有不同的用户(可能是 root)。 -
这是个好主意!可悲的是,它拥有所有人的阅读权限(并且归普通用户所有),就像它工作的 Hackathon 存储库一样。 :(
-
fs.readFileSync(realpath)的输出是什么?可能会导致调试问题。 -
正如其他人所提到的,我将验证
readFileSync的输出。dotenv.parse接受第二个参数来打开调试,这可以帮助您理解为什么您的解析对象没有被填充(例如dotenv.parse(buf, { debug: true }))