环境变量在节点/express 的子/导入文件内未定义

Zai*_*een 3 javascript environment-variables node.js es6-modules dotenv

我在我的 node/express 项目中使用dotenv包。

我有一个根/索引文件,我在其中导入不同的文件。

我仅在索引文件中导入 dotenv 。索引文件中的环境变量是可以访问的,但在导入的文件中这些环境变量是不可访问的。如何使其可以在 indes.js 中导入的其他文件中访问?

这是我的代码的一瞥

索引.js

import dotenv from "dotenv";
dotenv.config();
import { sync, getImages, downloadImage } from "./api/controllers/shutterstock";
console.log(process.env.SHUTTERSTOCK_ACCESS_TOKEN); //===>Working gives me the access token
Run Code Online (Sandbox Code Playgroud)

api/controllers/shutterstock.js

console.log(process.env.SHUTTERSTOCK_ACCESS_TOKEN); //===>undefined
Run Code Online (Sandbox Code Playgroud)

这就是我的目录结构的样子 在此输入图像描述

Ber*_*rgi 6

您的index.js正在importapi /controllers/shutterstock.js,并且导入被“提升”(在开始执行导入模块之前评估所有依赖项),这导致后者在执行之前console.log被评估并具有加载文件。 dotenv.config().env

您可以通过多种方式解决此问题:

  • 不要立即在shutterstock.jsprocess.env的顶级模块范围中访问,而只能在函数内部访问。如果你在之后调用,它就会起作用。downloadImagedownloadImage()dotenv.config()

  • 将shutterstock.js的加载推迟到dotenv初始化之后:

    import dotenv from "dotenv";
    dotenv.config();
    const { sync, getImages, downloadImage } = await import("./api/controllers/shutterstock");
    
    Run Code Online (Sandbox Code Playgroud)
  • 导入一个在Shutterstock.jsdotenv.config()模块之前执行调用的模块- 依赖项按顺序加载和评估。Dotenv 已经附带了这样的模块

    import "dotenv/config";
    import { sync, getImages, downloadImage } from "./api/controllers/shutterstock";
    
    Run Code Online (Sandbox Code Playgroud)