diff --git a/app/db/mongdb.ts b/app/db/mongdb.ts index 5f82f5c99..ac2e4e65e 100644 --- a/app/db/mongdb.ts +++ b/app/db/mongdb.ts @@ -1,28 +1,35 @@ -// 引入 `MongoClient` 类型,以便于类型注解 -import { MongoClient, MongoClientOptions } from "mongodb"; +import { MongoClient } from "mongodb"; -// 使用 `process.env.MONGODB_URI` 的值初始化 URI 变量 -const uri: string | undefined = process.env.MONGODB_URI; -// 定义 MongoClient 选项对象 -const options: MongoClientOptions = {}; +const uri = process.env.MONGODB_URI as string; // your mongodb connection string +const options = {}; -// 声明 client 和 clientPromise 变量,类型分别为 MongoClient 和 Promise -let client: MongoClient; -let clientPromise: Promise; - -// 判断当前环境是否为开发环境 -if (process.env.NODE_ENV === "development") { - // 在开发模式下,使用全局变量,以便在 HMR (Hot Module Replacement) 导致的模块重新加载时保留值。 - if (!global._mongoClientPromise) { - client = new MongoClient(uri!, options); // 使用非空断言运算符(!),因为我们已经检查了 uri 是否存在 - global._mongoClientPromise = client.connect(); - } - clientPromise = global._mongoClientPromise; -} else { - // 在生产模式下,最好不要使用全局变量。 - client = new MongoClient(uri!, options); // 使用非空断言运算符(!),因为我们已经检查了 uri 是否存在 - clientPromise = client.connect(); +declare global { + var _mongoClientPromise: Promise; } -// 导出模块作用域的 MongoClient promise。通过在一个单独的模块中这样做,client 可以在函数之间共享。 +class Singleton { + private static _instance: Singleton; + private client: MongoClient; + private clientPromise: Promise; + private constructor() { + this.client = new MongoClient(uri, options); + this.clientPromise = this.client.connect(); + if (process.env.NODE_ENV === "development") { + // In development mode, use a global variable so that the value + // is preserved across module reloads caused by HMR (Hot Module Replacement). + global._mongoClientPromise = this.clientPromise; + } + } + + public static get instance() { + if (!this._instance) { + this._instance = new Singleton(); + } + return this._instance.clientPromise; + } +} +const clientPromise = Singleton.instance; + +// Export a module-scoped MongoClient promise. By doing this in a +// separate module, the client can be shared across functions. export default clientPromise;