首页 > 解决方案 > NodeJS:控制加载模块的顺序

问题描述

这是场景:我有 3 个文件(模块):

应用程序.js

(async () => {
  await connectoDB();
  let newRec = new userModel({
    ...someprops
  });
  await newRec.save();
})();

app.ts是项目的入口点。

数据库.ts

interface ConnectionInterface {
  [name: string]: mongoose.Connection;
}

export class Connection {
  public static connections: ConnectionInterface;

  public static async setConnection(name: string, connection: mongoose.Connection) {
    Connection.connections = {
      ...Connection.connections,
      [name]: connection,
    };
  }
}

export async function connectToDB() {
  const conn = await mongoose.createConnection('somePath');
  await Connection.setConnection('report', conn);
}

模型.ts

const userSchema = new mongoose.Schema(
  {
    ..someprops
  },
);

const userModel = Connection.connections.report.model('User', userSchema);
export default userModel;

我正在尝试做的事情:我需要有多个猫鼬连接,所以我使用了一个connectionsConnection类 (in database.ts) 中调用的静态道具;每次连接到数据库时,我都会将连接setConnection存储在提到的静态属性中,因此我可以通过项目中的每个模块的名称访问它,report在这种情况下。

后来,在model.ts我使用Connection.connections.report访问连接report来加载我的模型!

然后,当我运行时,app.ts我收到以下合乎逻辑的错误:

const aggregationModel = Connection.connections.report.model('User', userSchema)
                                                ^
TypeError: Cannot read property 'report' of undefined

导致这个(我认为)的原因是,在加载导入的模块时app.ts.report没有声明,因为app.ts没有完全运行(connectoDB()定义.report键)。

我提到的代码已被简化以防止复杂性。原来的应用程序是一个快递应用程序!

现在,我应该如何解决这个错误?

提前致谢。

标签: javascriptnode.jstypescriptmongoose

解决方案


如果你稍微改变你的班级,你可以在使用它之前等待连接完成。

const connection = await Connection.getConnection()
const model = connection.example

...

class Connection {
  ...

  public static async getConnection() => {
    if (!Connection.connection) {
      await Connection.setConnection()
    }

    return Connection.connection
  }
}

推荐阅读