使用MongoDB Atlas客户端时,async方法返回Pending状态问题
解决构造函数中调用异步方法导致属性为Pending Promise的问题
构造函数无法使用await关键字,而getuserid是异步方法(async修饰),直接调用它会返回一个未完成的Promise对象,所以你的userid及关联属性会显示为Promise { <pending> }。
以下是两种可行的解决方案:
方案一:使用静态异步方法创建实例
将异步逻辑抽离到静态方法中,等待异步操作完成后再创建实例,确保所有属性都拿到resolved的值:
class CreateUser { constructor(userid, url) { this.userid = userid; this.user = { name: url[2], userid: userid, notes: {} }; this.passwordobj = { userid: userid, password: url[3] }; } static async create(url) { const DBclient = new mongoclient(uri); try { const database = DBclient.db('NotesApp'); const Users = database.collection('Users'); // 查询最大的userid,处理集合为空的情况 const userdata = await Users.findOne({}, { sort: { userid: -1 } }); const newUserId = userdata ? userdata.userid + 1 : 1; return new CreateUser(newUserId, url); } finally { await DBclient.close(); } } } // 使用时需要await静态方法 (async () => { const newuser = await CreateUser.create(["","signup","kushi","password123"]); console.log(newuser); })();
方案二:添加异步初始化方法
构造函数只做基础属性初始化,通过单独的init方法完成异步逻辑,之后等待初始化完成再使用实例:
class CreateUser { constructor(url) { this.url = url; // 先初始化空占位属性 this.userid = null; this.user = null; this.passwordobj = null; } async init() { const DBclient = new mongoclient(uri); try { const database = DBclient.db('NotesApp'); const Users = database.collection('Users'); const userdata = await Users.findOne({}, { sort: { userid: -1 } }); this.userid = userdata ? userdata.userid + 1 : 1; this.user = { name: this.url[2], userid: this.userid, notes: {} }; this.passwordobj = { userid: this.userid, password: this.url[3] }; } finally { await DBclient.close(); } return this; } } // 使用时先创建实例,再等待init完成 (async () => { const newuser = new CreateUser(["","signup","kushi","password123"]); await newuser.init(); console.log(newuser); })();
额外注意事项
- 处理数据库集合为空的情况:如果
Users集合还没有用户,findOne会返回null,直接访问userdata.userid会报错,所以要添加判断逻辑。 - 复用MongoDB连接:每次创建实例都新建客户端连接会影响性能,建议全局复用一个客户端连接(比如在应用启动时初始化一次,后续所有操作共用)。
内容的提问来源于stack exchange,提问作者7A7z
相关产品推荐
相关产品推荐

