【问题标题】:How to make .env variables work inside JS class constructors?如何使 .env 变量在 JS 类构造函数中工作?
【发布时间】:2020-09-07 21:07:04
【问题描述】:

我正在开发一个 Node/Express 项目。大多数代码都包含在文件夹内的文件中,因此名为“控制器”的文件夹包含项目的所有控制器,名为“服务”的文件夹包含项目的所有服务等。启动服务器的代码在里面一个名为 app.js 的文件,它直接位于项目根目录中。

所有控制器和服务都被声明为 JS 类并包含一个构造函数。 Dotenv 在 app.js 中加载,并且 env 变量在任何地方都可以很好地工作,但在类构造函数中,因为它们似乎是在 dotenv 初始化之前加载的。

使用的类语法示例:

export default class exampleService {
    constructor() {
        console.log('This is not working', process.env.EXAMPLE); // process.env.EXAMPLE is undefined
    }

    myFunction() {
        console.log('This works just fine', process.env.EXAMPLE); // process.env.EXAMPLE is exactly how it's defined in .env
    }

    // All other class methods are here.
}

有没有办法让 dotenv 变量在类构造函数中工作不必在每个类文件的开头导入和初始化 dotenv?

如果我确实将 dotenv 单独导入到每个类文件中,除了使代码不那么干净之外,它还有其他缺点吗?

【问题讨论】:

  • 来自dotenv's docs:“尽早在您的应用程序中,要求并配置 dotenv。require('dotenv').config()” - 您是否尝试将其添加为 server.js/app.js 中的第一个导入(或您的 package.json 指向的任何文件)?
  • @alfasin 我做到了,是的。即使 import dotenv from 'dotenv';const env = dotenv.config(); 是 app.js 中的第一行,env 变量在构造函数中也不起作用。
  • 您是否在 dotenv 上使用 preload 加载应用程序?
  • @alfasin 我不是。不过,我现在是,因为预加载显然解决了这个问题。谢谢!您想发布有关 .env 预加载的答案,以便我将其标记为解决方案吗?

标签: javascript node.js express dotenv


【解决方案1】:

尝试在 dotenv 上使用preload 加载应用程序(从源代码复制):

预加载

您可以使用 --require (-r) 命令行选项来预加载 dotenv。通过这样做,您无需在应用程序代码中要求和加载 dotenv。这是使用 import 而不是 require 时的首选方法。

$ node -r dotenv/config your_script.js

支持以下配置选项作为dotenv_config_<option>=value格式的命令行参数

$ node -r dotenv/config your_script.js dotenv_config_path=/custom/path/to/your/env/vars

此外,您可以使用环境变量来设置配置选项。命令行参数将位于这些参数之前。

$ DOTENV_CONFIG_<OPTION>=value node -r dotenv/config your_script.js
$ DOTENV_CONFIG_ENCODING=latin1 node -r dotenv/config your_script.js dotenv

【讨论】:

  • 谢谢,很好的回答!对于其他在此问题上苦苦挣扎的人,如果您使用 esm,请确保在 esm 之前需要 dotenv:node -r dotenv/config -r esm app.js
猜你喜欢
  • 2023-03-24
  • 2021-10-10
  • 1970-01-01
  • 2018-03-29
  • 2010-12-25
  • 2020-03-20
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多