NodeJS 无法识别 .env 文件

Posted

技术标签:

【中文标题】NodeJS 无法识别 .env 文件【英文标题】:NodeJS not recognizing .env file 【发布时间】:2020-07-17 04:27:49 【问题描述】:

我有 5 个 NodeJS 服务正在运行,但其中一个有问题。

这是nodemon.json 文件:


  "watch": ["**/*.ts"],
  "ext": "ts,json",
  "ignore": ["./test/*.ts"],
  "exec": "node -r ts-node/register -r dotenv/config Index.ts dotenv_config_path=$(pwd)/.env",
  "env": 
    "NODE_ENV": "development"
  

与其他服务相同。当我运行 npm run dev 时,我收到错误消息,具体取决于从 .env 文件中获取的值,例如:

const LOCAL_CONFIGURATION = 
    PORT_APP: 8082,
    MONGODB: 
        SERVER: process.env.MONGO_DTE,
        AUTH: 
            auth: 
                password:process.env.MONGO_PASSWORD,
                user:process.env.MONGO_USER
            
        ,
    ,
    MS_NOTIFICACION: "http://localhost:8089/notificacion",
    ELASTIC_PATH: process.env.ELASTIC_PATH,
    ...COMMON,
;

第一条错误信息是: ConfigurationError: Missing node(s) option 产生该消息是因为它没有从 process.env.ELASTIC_PATH 读取值,但如果我输入一个硬编码值,如“http://with.the.correct.url”,然后它再次尝试运行,我会收到另一个错误:

Error: Credentials must be provided when creating a service client 该错误是因为它试图读取 password:process.env.MONGO_PASSWORDuser:process.env.MONGO_USER

等等,所以,读取.env 文件时出现问题。我知道.env 文件具有这些值,并且该文件采用 UTF-8 格式,没有引号等。.env 文件与其他服务是同一个文件,它在其余部分工作正常,但我没有知道为什么这里没有被阅读。

有什么想法吗?

编辑:

另外,我在config.ts 文件中放了一个console.log(process.env);,它显示的值如下:

但是没有来自.env 的值,例如,图片中有一个名为COMPUTERNAME 的值,所以如果我输入console.log(process.env.COMPUTERNAME);,我得到:IBM-NOT87

为什么没有得到 .env 文件?

【问题讨论】:

请给我看看你的 .env 文件和它的位置 在应用程序的根目录。好的,我将使用文件的某些部分编辑 que 问题并附上评论 require('dotenv').config();在您尝试访问 env fie 的地方添加这些文件。并且像这样访问process.env.NODE_ENV 并且必须安装'dotenv' 【参考方案1】:

似乎您需要/配置dotenv。 Docs:

尽早在您的应用程序中要求并配置 dotenv。

require('dotenv').config()

【讨论】:

我应该把那个放在哪里?抱歉,使用 nodejs 的第一天,我已经花了 12 个小时来安装这 12 个微服务......这是唯一一个有问题的人 理想的应用程序入口点,有时命名为app.js。这会将您的.env 加载到process.env 应该在这里注册:exec": "node -r ts-node/register -r dotenv/config Index.ts dotenv_config_path=$(pwd)/.env", 那个脚本叫做nodemon 它是由npm start dev运行的 伙计……我不明白。当我在整个文件夹中搜索时,其余的微服务实际上并没有那个字符串。但是我把那行放在 Index.js 的第一部分,现在它可以工作了。我真的不明白。 Index.js 很棒!很高兴它有效。我不肯定那个 exec 脚本是如何工作的。关于其他微服务,您是否尝试过搜索“dotenv”的所有实例 - 还有其他方法可以要求/配置它。【参考方案2】:

进一步扩展@JBallin 回答

你应该在你的app.js上使用它

或者如果这不起作用,那么您需要将其显式添加到要使用这些变量的文件中

分享图片,因为它有时更容易看到展开

代码在这里=>

require('dotenv/config') // require the dotenv/config at beginning of file
const express = require('express')
const mongoose = require('mongoose')

【讨论】:

【参考方案3】:

require('dotenv').config( path: "./sample.env" );

在您使用环境变量的文件中, 尽早要求"dotenv",并在config()方法中指定.env文件的路径,即使它在你的根目录或节点启动的同一目录中。

要求和指定同一目录下的文件的代码在答案的第一行。

另外,为了进一步阅读?,您可以访问https://github.com/motdotla/dotenv#path

【讨论】:

【参考方案4】:

你猫试试这个。

-> npm i dotenv

并在代码中添加这段代码

require('dotenv').config(
    path: 'your path here'
)

【讨论】:

这个“新”答案所做的唯一一件事就是重复一半其他答案已经说过的话,包括accepted answer。【参考方案5】:

安装 dotenv 包

npm install --s dotenv

并将这个require("dotenv").config(); 添加到 index.js/ts 文件中。

【讨论】:

以上是关于NodeJS 无法识别 .env 文件的主要内容,如果未能解决你的问题,请参考以下文章

安装成功但无法识别节点

PIL.UnidentifiedImageError:无法识别图像文件

已安装 Node JS NPM 模块但无法识别命令

Powershell 无法识别Path Powershell 如何更新Path

Powershell 无法识别Path Powershell 如何更新Path

为啥在 Windows 上无法识别节点版本管理器 (NVM)?