javascript - 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;
我正在尝试做的事情:我需要有多个猫鼬连接,所以我使用了一个connections
在Connection
类 (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
键)。
我提到的代码已被简化以防止复杂性。原来的应用程序是一个快递应用程序!
现在,我应该如何解决这个错误?
提前致谢。
解决方案
如果你稍微改变你的班级,你可以在使用它之前等待连接完成。
const connection = await Connection.getConnection()
const model = connection.example
...
class Connection {
...
public static async getConnection() => {
if (!Connection.connection) {
await Connection.setConnection()
}
return Connection.connection
}
}
推荐阅读
- c++ - 我应该怎么做才能获得用户输入的最小序列?
- html - 如何使网格中的文本居中?
- linux - 如何执行 jar 文件中的 .sh 文件
- android - Appium 在移动设备上点击之前不会找到元素。如何找到它没有焦点的元素?
- reactjs - 我无法在 reactjs 应用程序中显示通知我正在使用 react-redux-notify
- python-3.x - Jupyter Notebook 无法在没有 Root 的情况下运行
- python - 串联初级水平
- android - 如何修复“无法封送值”错误
- reactjs - React Native 数据管理
- carrierwave - RailsAdmin Carrierwave 多次上传未定义的方法 `filename' for nil:NilClass