1

我正在创建一个 Next.js 应用程序,我注意到许多开发人员缓存了 MongoDB 连接。例如

let cachedClient = null;
let cachedDb = null;

export async function connectToDatabase() {
    if (cachedClient && cachedDb) {
        return {
            client: cachedClient,
            db: cachedDb,
        };
    }

    const opts = {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    };

    let client = new MongoClient(MONGODB_URI, opts);
    await client.connect();
    let db = client.db(MONGODB_DB);

    cachedClient = client;
    cachedDb = db;

    return {
        client: cachedClient,
        db: cachedDb,
    };
}

或者

let cached = global.mongoose

if (!cached) {
  cached = global.mongoose = { conn: null, promise: null }
}

async function dbConnect () {
  if (cached.conn) {
    return cached.conn
  }

  if (!cached.promise) {
    const opts = {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      bufferCommands: false,
      bufferMaxEntries: 0,
      useFindAndModify: true,
      useCreateIndex: true
    }

    cached.promise = mongoose.connect(MONGODB_URI, opts).then(mongoose => {
      return mongoose
    })
  }
  cached.conn = await cached.promise
  return cached.conn
}

我从未在 Express 应用程序中看到过这种情况,所以我有两个问题:

  1. 为什么缓存数据库连接在 Next.js 中如此常见,而我在 Express.js 中从未见过。他这样做的原因是什么?它是如何工作的?这值得吗?
  2. 正如您在上面的示例中看到的那样,一些开发人员使用有用的 let 变量,而其他一些开发人员使用全局变量。有什么区别,哪个是更好的解决方案?
4

0 回答 0