调用从父类继承的async异步函数时MongoDB Atlas库未创建如何解决?
排查步骤
优先验证
config变量的赋值时机
你在BaseServer构造函数中是给外部config对象赋值,首先确认./loaders模块的加载时机:如果另一个文件在导入BaseServer之前,就已经加载过./loaders模块,那么loaders里的数据库连接逻辑用的还是赋值前的旧databaseURL,自然不会连接到passandgoTest库。而在父类文件直接实例化时,赋值操作早于loaders加载,所以运行正常。
验证方式:在await require('./loaders').default这行代码前添加日志打印config.databaseURL,确认输出的连接地址是否是你传入的带passandgoTest的地址。校验MongoDB数据库触发创建的条件
MongoDB不会主动生成空数据库,只有当你往目标库中创建至少一个集合、或者插入一条数据时,数据库才会在Atlas面板显示。确认你在父类文件运行时是否有额外的初始化数据写入逻辑,而另一个文件调用时只启动了服务,没有执行任何数据写入/集合创建操作。
验证方式:在服务启动成功的回调中,手动调用一次集合创建逻辑,比如:
// 假设你用mongoose操作,引入mongoose后加这行 await mongoose.connection.createCollection('test_temp')
执行后看Atlas是否生成对应数据库。
检查异步调用逻辑
你当前调用obj.startServer()时没有加await,虽然这个问题不是直接诱因,但建议改为await obj.startServer(),避免异步逻辑顺序错乱。同时在./loaders的默认导出函数中打印连接数据库用的字符串,确认是否和你传入的一致。排查全局配置覆盖逻辑
排查项目中是否有其他代码在你实例化BaseServer之后,又修改了config.databaseURL的值,比如环境变量加载、全局配置覆写的逻辑,导致连接地址被篡改。
内容的提问来源于stack exchange,提问作者alesx

