当前位置: 首页 > 知识库问答 >
问题:

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

翟浩穰
2023-03-14

我试图找到问题的解决方案,但找不到,正在寻找一些“最佳实践范例”。我有一个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_键。我知道我可以通过在这两个函数中查询它们来获得它们,因为它们是异步函数,我可以在那里使用wait,但是每次查询都感觉很愚蠢(因为它永远不会改变)。

我该怎么办?我知道我能做到:

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

但这也让人感觉不舒服。。

有没有办法也做一些大函数,这是异步,并导出这两个函数?换句话说:我如何在文件(模块)的顶层使用等待。它不需要在顶级(这是不可能的),但某种方法让我的顶级变量暴露给我导出的函数。

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

共有1个答案

韶景曜
2023-03-14

你很接近:

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

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

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

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

1这些罕见的情况是:

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

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

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

 类似资料:
  • 例如,我希望将我的套接字路由和拆分为不同的文件,但仍然可以使用回调参数,如下所示: 到目前为止,它们都在一个文件中,我不喜欢这样。

  • 本文向大家介绍详解Nodejs的timers模块,包括了详解Nodejs的timers模块的使用技巧和注意事项,需要的朋友参考一下 本模块,属于来模拟一些浏览器自带方法的模块,比如setTimeout,clearTimeout等方法,之所以会有该模块,在我看来,也是为了能让前端工程师使用起来,更简单,使用一个单独的模块,来把浏览器上的功能来模拟出来,那么就可以直接减少学习的成本,这样就可以花更少的

  • nodejs的出现,可以算是前端里程碑式的一个事件,它让前端攻城狮们摆脱了浏览器的束缚,踏上了一个更加宽广的舞台。前端的可能性,从此更加具有想象空间。 随着一系列基于nodes的应用/工具的出现,工作中与nodejs打交道的机会越来越多。无论在node应用的开发,还是使用中,包管理都扮演着一个很重要的作用。NPM(node package manager),作为node的包管理工具,极大地便利了我

  • 本文向大家介绍NodeJs中的VM模块详解,包括了NodeJs中的VM模块详解的使用技巧和注意事项,需要的朋友参考一下 什么是VM? VM模块是NodeJS里面的核心模块,支撑了require方法和NodeJS的运行机制,我们有些时候可能也要用到VM模板来做一些特殊的事情。 通过VM,JS可以被编译后立即执行或者编译保存下来稍后执行(JavaScript code can be compiled

  • 问题内容: 我一直在浏览/ 在浏览了几篇文章之后,我决定自己测试一下。但是,我似乎无法绕开为什么这行不通的想法: 控制台输出以下内容(节点v8.6.0): 外部:[对象承诺] 内部:嘿 为什么函数内部的日志消息随后执行?我认为创建/ 的原因是为了使用异步任务执行同步执行。 有没有办法可以使用函数内部返回的值而不使用after ? 问题答案: 我似乎无法绕开为什么这行不通的想法。 因为回报承诺;所有

  • 问题内容: 我想知道配置模块导出的最佳方法是什么。在下面的示例中,“ async.function”可以是FS或HTTP请求,为示例起见简化了该请求: 这是示例代码(asynmodule.js): 如何仅在执行异步回调后导出模块? 编辑 有关我的实际用例的简短说明:我正在编写一个模块,用于在fs.exists()回调中配置nconf(https://github.com/flatiron/ncon