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

调用MongoDriver类addObject静态方法时出现getClient未定义错误

解决ReferenceError: getClient is not defined的问题

这个报错的核心是静态方法无法直接访问类的私有实例方法,再加上代码里的几处小失误,导致了这个错误,咱们一步步拆解:

问题根源

  1. 私有实例方法与静态方法的上下文差异
    你定义的#getClient、#getDatabase、#getCollection都是私有实例方法(带#的私有方法默认归属于类的实例),而addObject是静态方法。静态方法挂载在类本身,没有类的实例上下文,完全看不到这些实例私有方法,所以直接调用getClient()会提示未定义。

  2. 调用时缺少正确的引用
    就算方法能被访问,你代码里直接写getClient(connectionDetails.getUri()),既没有用实例(静态方法里的this指向类本身,不是实例,没法用this.#getClient),也没有用类名引用,JS自然找不到这个函数。

  3. 额外的变量名错误
    你把客户端实例赋值给了mongoClient,但后续调用getDatabase和getCollection时却用了client,这也会触发client is not defined的错误,得一起修正。

修复方案

把这些私有实例方法改成私有静态方法(在方法前加上static关键字),让静态方法addObject能正常访问它们,同时修正变量名和判断逻辑的问题:

const MongoClient = require("mongodb").MongoClient;
const ConnectionDetails = require("./ConnectionDetails").ConnectionDetails;
const Recipe = require("./recipe").Recipe;
var ObjectId = require('mongodb').ObjectID;

class MongoDriver{
    // 改为私有静态方法
    static async #getClient(uriString){
        const client = new MongoClient(uriString);
        await client.connect();
        return client;
    }
    static #getDatabase(client, dbString){
        const db = client.db(dbString);
        return db;
    }
    static #getCollection(client, collectionString){
        return client.collection(collectionString)
    }

    static async addObject(object, connectionDetails){
        // 修正instanceof的判断优先级问题
        if(!(connectionDetails instanceof ConnectionDetails)){
            throw "connectionDetails must be of type ConnectionDetails but is " + typeof(connectionDetails);
        }
        if(!(object instanceof Recipe)){
            throw "object must be of type Recipe but is " + typeof(object);
        }
        // 用类名引用私有静态方法,修正变量名
        const client = await MongoDriver.#getClient(connectionDetails.getUri());
        const database = MongoDriver.#getDatabase(client, connectionDetails.getDatabase());
        const collection = MongoDriver.#getCollection(client, connectionDetails.getCollection());
        const result = await collection.insertOne(object);
        // 新增关闭连接操作,避免资源泄漏
        await client.close();
        return result;
    }
}

module.exports.MongoDriver = MongoDriver;

额外提醒:

  • 修正了instanceof的判断逻辑(原代码的!connectionDetails instanceof ConnectionDetails优先级错误,需要用括号包裹判断)
  • 添加了客户端连接关闭操作,避免长期占用数据库连接资源

内容的提问来源于stack exchange,提问作者jakegergen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:33:21