2

我正在开发标准的 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 存储库,它使用相同的方法

最初,它不起作用,因为作者使用了相对路径。使用绝对路径,它可以工作。

如果有帮助,请提供更多信息:

/* ===========  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
4

1 回答 1

2

经过太多时间检查我的代码,我终于发现了这个问题。

根据操作系统和文件本身(以及文本编辑器和 IDE),在行尾你可以有一个换行(“LF”)字符(0x0A,\n),回车(“CR”)字符(0x0D, \r ) 或行尾 ("EOL") 字符 (0x0D0A, \r\n )。

不幸的是,dotenv只能理解\n为一行的结束。因此,由于检查的简单性,这是一个解析问题。然而,据我所知,这\n一种标准。

在此处输入图像描述

由于某种原因,该.env文件被\r用作行分隔符。所以这是一个快速修复:

在此处输入图像描述

就我而言,使用 JetBrains 产品,您可以在设置中配置为始终使用同一行尾。

于 2019-10-08T17:57:42.187 回答