Node.js中使用MongoDB事务必须先调用client.startSession()创建会话所有操作需显式传入{session}选项且事务仅支持副本集或分片集群不跨数据库推荐使用withTransaction()自动处理提交与回滚。Node.js 里开启 MongoDB 事务必须用 startSession()不调这个函数后面所有 withTransaction() 或手动 commitTransaction() 都会报错TopologyDescription not connected 或直接抛 TypeError: Cannot read property startTransaction of undefined。它不是可选步骤是硬性前置。常见错误是直接在 db.collection(x).insertOne() 前加事务逻辑忘了 session 是独立对象得显式创建、传入、结束。const session client.startSession() 必须在 client.connect() 之后调用事务内所有操作insertOne、updateOne 等都得显式传入 { session } 选项session 不能复用一次事务结束后不能再用同一个 session 对象开启新事务要重用就得 session.endSession() 后再 client.startSession()用 withTransaction() 比手动 commitTransaction()/abortTransaction() 更安全手动控制容易漏掉 abortTransaction()尤其在异步异常或未捕获的 Promise rejection 场景下导致事务卡住、连接池耗尽MongoDB 日志里会出现 transaction is already committed or aborted 这类误导性错误。withTransaction() 内部自动处理 commit/abort 分支也支持重试逻辑默认 5 次对网络抖动或临时冲突更鲁棒。回调函数必须返回一个 Promise否则事务不会等待就直接 commit回调里抛出任何 error包括 throw new Error()、Promise.reject()、未 catch 的 rejected promise都会触发 abort不要在回调里调用 session.commitTransaction() —— 它会报 Transaction already completedawait session.withTransaction(async () { await db.collection(orders).insertOne({ status: pending }, { session }); await db.collection(inventory).updateOne( { sku: abc }, { $inc: { qty: -1 } }, { session } );});MongoDB 事务要求副本集或分片集群单机 mongod 不支持本地开发时如果只起一个 mongod --port 27017执行事务会立刻失败错误信息是Transaction numbers are only allowed on a replica set member or mongos。这不是驱动问题是服务端限制。 文心快码 文心快码Comate是百度推出的一款AI辅助编程工具