Изучаю Next.js. И заметил такое, что соединение с базой данных часто кэшируют. Например, так:
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
}
Касательно этого у меня появилось 2 вопроса.
- Я ни разу не встречал такого в Express.js. Но в Next.js-проектах кэширование соединения встречается довольно часто. Почему это так? И для чего это делается?
- В двух примерах немного разная реализация. В первом примере через простую let-переменную. Во втором примере через глобальную переменную. В чем разница? И какой подход лучше?