我正在开发标准的Node + Express Web应用程序。其他一切工作正常,但是我无法制作.env
文件来填充process.env
起初,我认为这是一个范围问题,因为从其中调用dotenv
的app.js位于src子文件夹中,而.env
位于根目录中。但是,使用节点工具并通过名为find-config
的软件包进行确认,我具有正确的绝对路径。我从来没有为找不到文件的消息。
我尝试了一切,从文档中介绍的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输出{{1}},它与我尝试过的每种途径都一致:从不出错,也从不解析对象。只是虚无。
这样做:
{}
它会抛出const results = JSON.stringify(dotenv.config({"path":"/100%/correct/path/.env"}));
我变得非常可疑,以至于我下载,安装并运行了29k星的大型Hackathon Starter存储库,该存储库使用same method。
最初,它不起作用,因为作者使用了相对路径。有了绝对路径,它就可以工作。
更多信息,以帮助您:
{"parsed":{}}
这将记录以下内容:
/* =========== 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: {}
答案 0 :(得分:0)
花了很多时间检查我的代码后,我终于发现了问题。
根据操作系统以及文件本身(以及文本编辑器和IDE)的不同,在该行的末尾可以有一个换行(LF)字符(0x0A, \ n ),回车符(“ CR”)字符(0x0D, \ r )或行尾(“ EOL”)字符(0x0D0A, \ r \ n )。 / p>
不幸的是,dotenv
仅将\n
理解为一行的结尾。因此,由于检查的简单性,这是一个解析问题。据我所知,\n
是标准的类。
由于某种原因,.env
文件使用\r
作为行分隔符。所以这是一个快速修复:
就我而言,使用JetBrains产品,您可以在设置中进行配置,以始终使用相同的行尾。