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

ulmd4ohb  于 2023-08-04  发布在  Node.js
关注(0)|答案(4)|浏览(138)

我在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


这就是我的目录结构看起来像x1c 0d1x的样子

ifmq2ha2

ifmq2ha21#

您的 index.js 正在import上运行 API/controllers/shutterstock.js,并且导入被“提升”(在开始执行导入模块之前评估所有依赖项),这导致后者中的console.log在执行**dotenv.config()并加载.env文件之前被评估**。
您可以通过以下几种方式解决此问题:

  • 不要立即访问 shutterstock.js 中顶级模块范围内的process.env,但例如只在downloadImage函数内部。如果在dotenv.config()之后调用downloadImage(),它就可以工作。
  • 推迟 shutterstock.js 的加载,直到dotenv初始化之后:
import dotenv from "dotenv";
dotenv.config();
const { sync, getImages, downloadImage } = await import("./api/controllers/shutterstock");

字符串

  • shutterstock.js 模块之前导入执行dotenv.config()调用的模块-依赖项按顺序加载和评估。Dotenv已经有了这样一个模块:
import "dotenv/config";
import { sync, getImages, downloadImage } from "./api/controllers/shutterstock";

unhi4e5o

unhi4e5o2#

另一个解决方案形成此评论:https://github.com/motdotla/dotenv/issues/133#issuecomment-255298822
将dotenv调用移动到一个单独的文件中,然后将其导入index.js。

// index.js
import _ from './env'
import hello from './hello'

个字符
还建议从库Create a separate file that will execute config first as outlined in this comment on #133https://www.npmjs.com/package/dotenv中获取

z2acfund

z2acfund3#

import { default as dotenv } from“dotenv”; dotenv.config({ path:'../.env' });当其他解决方案没有的时候,这对我很有效,尝试了单独的文件导入,以及这个线程中的其他所有内容,https://github.com/motdotla/dotenv/issues/133也尝试了其他堆栈文章,这篇文章用es6风格的导入进行了标准节点设置。

5f0d552i

5f0d552i4#

确保require('dotenv ').config()位于index.js文件中所有文件导入的上方。基本上,导入序列(需要)

相关问题