在node / express的子文件/导入文件中未定义环境变量

问题描述

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

我有一个根目录/索引文件,我正在导入其他文件

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

以下是我的代码

index.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

api / controllers / shutterstock.js

console.log(process.env.SHUTTERSTOCK_ACCESS_TOKEN); //===>undefined

这是我的目录结构的样子

enter image description here

解决方法

您的 index.js import正在 api / controllers / shutterstock.js 中,并且导入已“悬挂”(在开始之前先评估所有依赖项)导入模块的执行),这会导致在导入后的console.log 执行之前dotenv.config()进行评估并加载了.env文件。>

您可以通过以下几种方法解决此问题:

  • 不要立即访问 shutterstock.js 的顶级模块范围中的process.env,但例如仅在downloadImage函数内部。如果您在downloadImage()之后致电dotenv.config(),它将可以使用。

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

    import dotenv from "dotenv";
    dotenv.config();
    const { sync,getImages,downloadImage } = await import("./api/controllers/shutterstock");
    
  • 导入一个模块,该模块在 shutterstock.js 模块之前执行dotenv.config()调用-依序加载和评估依赖项。已经Dotenv comes with such a module

    import "dotenv/config";
    import { sync,downloadImage } from "./api/controllers/shutterstock";