调用MongoDriver类addObject静态方法时出现getClient未定义错误
解决ReferenceError: getClient is not defined的问题
这个报错的核心是静态方法无法直接访问类的私有实例方法,再加上代码里的几处小失误,导致了这个错误,咱们一步步拆解:
问题根源
私有实例方法与静态方法的上下文差异
你定义的#getClient、#getDatabase、#getCollection都是私有实例方法(带#的私有方法默认归属于类的实例),而addObject是静态方法。静态方法挂载在类本身,没有类的实例上下文,完全看不到这些实例私有方法,所以直接调用getClient()会提示未定义。调用时缺少正确的引用
就算方法能被访问,你代码里直接写getClient(connectionDetails.getUri()),既没有用实例(静态方法里的this指向类本身,不是实例,没法用this.#getClient),也没有用类名引用,JS自然找不到这个函数。额外的变量名错误
你把客户端实例赋值给了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
相关产品推荐
相关产品推荐

