gpt4 book ai didi

Javascript/Nodejs 在 nodejs 模块的顶层使用 await

转载 作者:行者123 更新时间:2023-11-30 07:49:16 28 4
gpt4 key购买 nike

我试图找到我的问题的解决方案,但找不到,并且正在寻找一些“最佳实践示例”。我有一个 nodejs express 应用程序,我的函数在文件中拆分。例如我有这个 Controller (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。我知道我可以通过在两个函数中查询它们来获取它们,因为它们是异步函数,我可以在那里使用 await,但每次都查询它感觉很愚蠢(因为它永远不会改变)。

我该如何管理它?我知道我可以做到这一点:

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

但这也让人感觉不对..

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

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

最佳答案

你很接近:

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

创建一个 promise ,然后在您想要使用它时等待该 promise 。

How do I use await on the top level of a file (module).

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


¹ 那些罕见的情况是:

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

2) await在你的服务的顶层文件中:因为没有模块依赖它,这不会导致任何问题。


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

关于Javascript/Nodejs 在 nodejs 模块的顶层使用 await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56380592/

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