javascript 在继续之前等待mongoose连接

hc8w905p  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(98)

我在Node.js中有一个项目,它是一个连接到ChatGPT,Google和其他API的API,获取,保存和发送数据。
因此,我为每个API创建了一个类,一个ChatGPT类,一个GoogleAPI类和一个MongoDb类。但我遇到了一个无法克服的问题。
有一个API类可以初始化所有这些类,我使用它作为不同类之间的桥梁。
在网桥的constructor类中:

var gptInstance = new ChatGPTManager();
var cronInstance = new CronJobManager();
var dbInstance = new DbManager();
var nlpInstance = new NaturalLanguage();
var apInstance = new AndroidPublisher(database);

问题是DbManager正在连接mongoose,这需要几秒钟,我需要使用AndroidPublisher类中的示例。
由于某种原因,我无法找到返回类并将其发送回AndroidPublisher供其使用的方法。

class API {
  constructor() {
    this.connect();
  }

  async connect() {
    //  API is connected.
    console.log(`\x1b[33m%s\x1b[0m`, '-> API Initialized.');
    var gptInstance = new ChatGPTManager();
    var cronInstance = new CronJobManager();
    var dbInstance = new DbManager();
    var nlpInstance = new NaturalLanguage();
    var apInstance = new AndroidPublisher();

    auth = new google.auth.GoogleAuth({
      keyFile: config.GOOGLE_AUTH_KEY_FILE,
      scopes: config.GOOGLE_AUTH_SCOPES
    });

    authClient = await auth.getClient();

    nlpInstance.connect(authClient);
    apInstance.connect(authClient, dbInstance); <-- 'dbInstance' here is undefined
  }
}

我甚至尝试在DbManager类中的mongoose连接上设置一个回调,当我有结果时,在nlpInstance和apInstance上调用connect,但我仍然无法从数据库中定义。

ssm49v7z

ssm49v7z1#

您可以利用连接事件。
在您的DbManager类中,使用mongoose.connect(...)示例化连接后,您可以使用mongoose.connection访问 default connection 对象,并监听任何类型的事件。具体来说,您需要open事件(阅读上面链接的Mongoose文档的 Connection Events 段落)。然后,您只需要调用 default connection 对象上的once方法,并指定事件和当事件发生时要执行的函数。
下面是一个完整的代码示例,包括DB连接的创建:

const mongoose = require("mongoose")

const dbConnectionString = '<Your MongoDB connection string here>';
mongoose.connect
(
    dbConnectionString,
    {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    }
);

const db = mongoose.connection;
db.once("open", () =>
{
    console.log("The connection was successful");

    // Put your class return logic here
});

只有当open事件发生时,才能返回DbManager类。

相关问题