Next.js中Mongoose连接MongoDB:async函数用.then的原因及await改写
关于Mongoose连接代码的疑问解答
为什么用.then而不是await?
这段代码的核心是缓存MongoDB连接的Promise对象,避免在Next.js开发环境热重载或并发请求时创建大量重复连接。
原代码中cached.promise = mongoose.connect(MONGODB_URI, opts).then(mongoose => mongoose)的作用是:
- 直接将
mongoose.connect返回的Promise赋值给cached.promise,而非等待连接完成后再赋值。 - 当多个请求同时调用
dbConnect时,只要cached.promise已存在,所有请求都会共享同一个连接Promise,不会重复发起连接请求。 - 如果这里直接用
await,第一次调用时会等待连接完成,但在连接未完成的间隙,其他请求会因cached.promise还是null,再次执行mongoose.connect,导致重复创建连接,违背缓存的初衷。
用await改写的版本
要保留缓存Promise的逻辑,同时用await改写,可以把连接逻辑包裹在立即执行的async函数里(async函数本身会返回Promise),让cached.promise依然能拿到Promise对象:
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 } // 用async函数包裹连接逻辑,返回Promise并缓存 cached.promise = (async () => { await mongoose.connect(MONGODB_URI, opts); return mongoose; })(); } cached.conn = await cached.promise return cached.conn }
这个改写版本和原代码逻辑完全一致:
- 第一次调用时,创建async函数并立即执行,得到Promise赋值给
cached.promise - 后续所有请求都会等待同一个Promise完成,确保只建立一次连接
- 连接完成后,
cached.conn会被赋值,后续请求直接返回缓存的连接实例
内容的提问来源于stack exchange,提问作者cbutler
相关产品推荐
相关产品推荐

