Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何等待env变量加载到Node.JS/TypeScript/JavaScript中_Javascript_Node.js_Typescript - Fatal编程技术网

如何等待env变量加载到Node.JS/TypeScript/JavaScript中

如何等待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 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 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
    同步。这意味着,当函数返回时,幕后不会发生任何其他事情。我不知道函数的内部结构,所以我显然无法进一步指导您,但有时异步函数也有一个同步变量,您可以使用它。