Javascript / Nodejs在Node.js模块的顶层使用await

Eri*_*sen 1 javascript asynchronous node.js

我试图找到解决问题的方法,但找不到,并在寻找一些“最佳实践示例”。我有一个nodejs express应用程序,我的功能分为文件。例如,我有此控制器(oktacontroller.js):

var okta_api_key = <here some await data, getting from db>;

const OKTA_ORG_URL = '<here too>';

exports.createUser = async (req, res) => {

    console.log(okta_api_key);
}

exports.getGroups = async (req, res) => {
    console.log(okta_api_key);
}
Run Code Online (Sandbox Code Playgroud)

在两个导出的函数(都是快速路由)中,我都需要var okta_api_key。我知道我可以通过在两个函数中查询它们来获取它们,因为它们是异步函数,我可以在那儿使用await,但是每次查询它都感觉很愚蠢(因为它永远不会改变)。

我该如何处理?我知道我可以这样做:

var okta_api_key = <here some await data, getting from db>;

const OKTA_ORG_URL = '<here too>';

exports.createUser = async (req, res) => {

    console.log(okta_api_key);
}

exports.getGroups = async (req, res) => {
    console.log(okta_api_key);
}
Run Code Online (Sandbox Code Playgroud)

但这感觉也不错。

有什么办法可以使某种大型函数(异步)导出两个函数吗?换句话说:如何在文件(模块)的顶层使用await。它不需要在顶层(这是不可能的),但是可以使用某种方法使我的“顶层”变量暴露给导出的函数。

编辑:其他用例,因为我得到了将其放在配置文件中的建议。是的,这是可行的,但是例如:我还有其他一些api密钥,每次启动时都会从服务本身获取他的访问令牌(因为它会过期)。该令牌无法存储在配置文件中,因此我需要一些异步工作来获取该值。我知道顶级等待不起作用(甚至是不希望的),但是我只想举一个例子,说明如果这是您的项目,你们将如何做:)

Jon*_*lms 6

您接近:

 var okta_api_key = (async () => {
    return  await <getting key async>
 })();
Run Code Online (Sandbox Code Playgroud)

创建一个承诺,然后await在您要使用它时就创建一个承诺 。

如何在文件(模块)的顶层使用等待。

顶层await看起来不错:您只需添加一个await,然后就可以同步访问该变量。但是,这简化了太多事情:它将停止执行依赖该模块的所有模块。在大多数情况下,您不想要¹。而是创建一个异步任务的承诺,然后在需要时等待它。这样,您可以将异步执行限制为实际需要的代码段。


¹这些罕见的情况是:

1)加载一些全局配置,您必须在代码中的任何地方访问它,因此,如果配置未准备好,则启动服务是没有意义的。

2)await在您服务的顶层文件中:由于没有模块依赖它,因此不会造成任何问题。


旁注:尚未指定顶层等待,并且还没有NodeJS支持。要在生产中使用它,您必须等待几个月(?)。