我正在创建一个 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 应用程序中看到过这种情况,所以我有两个问题:
- 为什么缓存数据库连接在 Next.js 中如此常见,而我在 Express.js 中从未见过。他这样做的原因是什么?它是如何工作的?这值得吗?
- 正如您在上面的示例中看到的那样,一些开发人员使用有用的 let 变量,而其他一些开发人员使用全局变量。有什么区别,哪个是更好的解决方案?