Javascript / Nodejs 在 Nodejs 模块的顶层使用等待

2024-01-06

我尝试找到问题的解决方案,但找不到它,并且正在寻找一些“最佳实践示例”。我有一个 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);
}

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

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

var okta_api_key;
(async () => {
    okta_api_key = await <getting key async>
})()

不过这个感觉也不太对劲..

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

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


你很接近:

 var okta_api_key = (async () => {
    return  await <getting key async>
 })();

然后创建一个承诺await每当您想使用它时,都会得到这个承诺。

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

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


¹ 这些罕见的情况是:

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

2) await在服务的顶级文件中添加:由于没有模块依赖于它,因此这不会导致任何问题。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript / Nodejs 在 Nodejs 模块的顶层使用等待 的相关文章

随机推荐