Node.js 来自多个模块的数据库初始化

Node.js database initalization from multiple modules

我在一个项目中有 3 个模块:A、B、C;他们都在使用 Rethinkdb,这需要在初始化时调用异步 r.connect。

我正在尝试从命令行调用模块 A 到 B;然而,尽管在 require() 上启动 r.connect,B 无法提供此服务,因为在模块 A 调用时 rethinkdb 尚未加载。

可以通过哪些方式重构此代码,以便我实际上可以确保在调用 B 之前完成所有初始化?

我试过使用闭包来传递模块的状态;但是,由于 r.connect 仅可用作异步函数,因此将采用以下形式:

r.connect( config.rethinkdb, function(err, connection)  {
    rconn = connection;
    // all module requires
    require("./moduleB")(rconn);
    require("./moduleC")(rconn);

    ...lotsacode...
});

这感觉很不对。有更好的建议吗?

您可以使用 promise,并传递连接。像这样

r.connect(config.rethinkdb)
.then(function(connection) {
  //do some stuff here if you want
  initWholeApp(connection)
})

并在 initWholeApp 连接内,您可以放置​​您的应用程序代码。

你甚至可以将其简化为

r.connect(config.rethinkdb)
.then(initWholeApp)

With initWholeApp 是一个接受参数作为建立连接的函数。

不仅如此,您甚至可以 运行 在完成该查询后对连接进行每个查询(只需确保关闭连接),或者使用带有支持的驱动程序的 RethinkDB 连接池例如 https://github.com/neumino/rethinkdbdash 或自己滚动。