如何等待env变量加载到Node.JS/TypeScript/JavaScript中
目标:在启动服务器之前将松弛凭据加载到env vars中 我有我的如何等待env变量加载到Node.JS/TypeScript/JavaScript中,javascript,node.js,typescript,Javascript,Node.js,Typescript,目标:在启动服务器之前将松弛凭据加载到env vars中 我有我的env.ts: import dotenv from "dotenv"; import path from "path"; import { loadAwsSecretToEnv } from "./awsSecretLoader"; // Expose a function, that returns a promise export default async fu
env.ts
:
import dotenv from "dotenv";
import path from "path";
import { loadAwsSecretToEnv } from "./awsSecretLoader";
// Expose a function, that returns a promise
export default async function loadConfiguration() {
const stage = process.env.NODE_ENV ?? "local";
dotenv.config();
if (process.env.SLACK_SECRET) {
await loadAwsSecretToEnv(process.env.SLACK_SECRET); // propagate all inner promises by awaiting them
}
}
import loadConfiguration from "./config/env"; // Get the load function
import logger from "./logger";
import { app } from "./slack";
// Start ///////////////////////////////////////////////////////////////////////
(async () => {
await loadConfiguration();
// Now we're safe, since we have waited for the configuration to load
const port = (process.env.PORT || 8080) as number;
await app.start(port);
logger.info("⚡️ Slack is running on port %s!", port);
})();
从“dotenv”导入dotenv;
从“路径”导入路径;
从“/awsSecretLoader”导入{loadAwsSecretToEnv}”;
const stage=process.env.NODE\u env??“本地”;
dotenv.config();
if(process.env.SLACK\u SECRET){
loadAwsSecretToEnv(process.env.SLACK\u SECRET);
}
我的index.ts
是:
导入“/config/env”;
从“/logger”导入记录器;
从“/slack”导入{app};
//开始///////////////////////////////////////////////////////////////////////
const port=(process.env.port | | 8080)作为编号;
(异步()=>{
等待应用程序启动(端口);
logger.info(“⚡️ Slack正在端口%s!上运行(端口);
})();
现在的问题是,loadAwsSecretToEnv
是异步的(显然),当服务器启动时,凭据没有加载到env vars中,因此服务器无法启动
我的问题是如何确保在启动应用程序之前加载环境变量。
我是TS新手,不确定整个方法是否有缺陷,或者是否有解决上述问题的方法。
有人能帮我吗?谢谢。当前
env.ts
没有告诉外界加载完成的时间。这就是承诺的目的
您需要:
env.ts
中返回一个承诺,该承诺在加载完成后解析index.ts中等待承诺
env.ts
:
import dotenv from "dotenv";
import path from "path";
import { loadAwsSecretToEnv } from "./awsSecretLoader";
// Expose a function, that returns a promise
export default async function loadConfiguration() {
const stage = process.env.NODE_ENV ?? "local";
dotenv.config();
if (process.env.SLACK_SECRET) {
await loadAwsSecretToEnv(process.env.SLACK_SECRET); // propagate all inner promises by awaiting them
}
}
import loadConfiguration from "./config/env"; // Get the load function
import logger from "./logger";
import { app } from "./slack";
// Start ///////////////////////////////////////////////////////////////////////
(async () => {
await loadConfiguration();
// Now we're safe, since we have waited for the configuration to load
const port = (process.env.PORT || 8080) as number;
await app.start(port);
logger.info("⚡️ Slack is running on port %s!", port);
})();
index.ts
:
import dotenv from "dotenv";
import path from "path";
import { loadAwsSecretToEnv } from "./awsSecretLoader";
// Expose a function, that returns a promise
export default async function loadConfiguration() {
const stage = process.env.NODE_ENV ?? "local";
dotenv.config();
if (process.env.SLACK_SECRET) {
await loadAwsSecretToEnv(process.env.SLACK_SECRET); // propagate all inner promises by awaiting them
}
}
import loadConfiguration from "./config/env"; // Get the load function
import logger from "./logger";
import { app } from "./slack";
// Start ///////////////////////////////////////////////////////////////////////
(async () => {
await loadConfiguration();
// Now we're safe, since we have waited for the configuration to load
const port = (process.env.PORT || 8080) as number;
await app.start(port);
logger.info("⚡️ Slack is running on port %s!", port);
})();
如果
loadAwsSecretToEnv
返回一个承诺,那么在运行app.start
之前,您可以等待它。在导出函数中执行env.ts
中的所有工作,这样index.ts
就可以决定何时调用它以及如何等待结果。这意味着我需要将代码移到app
代码片段旁边,对吗?有更干净的方法吗?不,这就是函数的用途!如果你在函数之外做任何事情,你就会失去很多控制。我不知道该怎么做。/slack
中的代码使用env-vars做了大量工作。这意味着我还需要重构整个代码。是否有一种类似于dotenv.config()
的方法。我怀疑它是以同步方式从文件加载env变量的。不?我觉得这没用。AFAIK添加wait
不能保证执行顺序。换句话说,在您现在写的地方,我们是安全的,但我们不是真正安全的。如果loadAwsSecretToEnv
返回一个承诺,那么wait
保证承诺已经解决()。如果没有,那么您需要改进loadAwsSecretToEnv
,让调用者知道它何时完成;通过返回承诺或允许回调函数作为参数.Right。我的理解不正确。但我仍然想知道是否有一种方法可以像dotenv.config()
那样实现。正如您前面所述,loadAwsSecretToEnv
是异步的。这意味着,当函数返回时,您不知道函数的异步部分何时结束。正如我上面所说的,您必须重新编写函数,让调用方知道异步部分何时结束,有两种方法:承诺或回调函数参数。或者,您可以选择使loadAwsSecretToEnv
同步。这意味着,当函数返回时,幕后不会发生任何其他事情。我不知道函数的内部结构,所以我显然无法进一步指导您,但有时异步函数也有一个同步变量,您可以使用它。