gpt4 book ai didi

javascript - ES6 导入发生在 .env 导入之前

转载 作者:数据小太阳 更新时间:2023-10-29 05:49:22 24 4
gpt4 key购买 nike

尝试使用我的 dotenv 文件中的环境变量会使我的应用程序崩溃,因为 dotenv 文件似乎没有按时加载。

// server.js
require('dotenv').config({ silent: process.env.NODE_ENV === 'production' })
console.log("Here is the env var: ", process.env.SPARKPOST_API_KEY) // works
import express from 'express'
import routes from './routes'
(...)
app.use('/api', routes);

// routes/index.js
import somecontroller from '../controllers/somecontroller'
const routes = express.Router()
routes.use('/somecontroller', somecontroller)

// somecontroller.js
import sendEmail from '../helpers/sparkpost'

// ./helpers/sparkpost.js
import SparkPost from 'sparkpost'
var sparky = new SparkPost() // uses process.env.SPARKPOST_API_KEY
export default function sendEmail() {
}

因错误而崩溃

Error: Client requires an API Key.

API key 在那里,所以 sparkpost.js 似乎在加载 dotenv 文件之前实例化 new SparkPost()

我该如何解决这个问题?

最佳答案

Javascript import 被提升(但不是 Typescript!),因此导入的模块将在任何当前模块初始化代码运行之前初始化。幸运的是导入的模块是按顺序初始化的,所以一个可能的解决方法是将配置代码放在它自己的模块中:

// main.js <- make this your entry point
import "./config";
import "./server";

// config.js
import dotenv from "dotenv";
dotenv.config({ silent: process.env.NODE_ENV === 'production' });

// server.js
import express from 'express';
import SparkPost from 'sparkpost';
const sparky = new SparkPost();
...

编辑:

更简单:

// config.js
import dotenv from "dotenv";
dotenv.config({ silent: process.env.NODE_ENV === 'production' });

// server.js <- make this your entry point
import './config';
import express from 'express';
import SparkPost from 'sparkpost';
const sparky = new SparkPost();
...

编辑:

最初的问题和答案是在仅考虑 Javascript 的情况下编写的。多年过去了,Typescript 开始流行起来。 Typescript 编译器目前不提升导入,因此您可以在导入之前在入口点 .ts 文件中初始化 dotenv。 p>

关于javascript - ES6 导入发生在 .env 导入之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42817339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com