You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:43:18