Node.js mongoose在不同的路由上正确启动事务
在我的Node.js express应用程序中,我尝试通过mongoose进行事务处理。我成功连接到MongoDB,并尝试通过我应用程序中的另一个路由基于该连接启动事务。但不知何故,我无法通过Node.js mongoose在不同的路由上正确启动事务,node.js,mongodb,express,mongoose,transactions,Node.js,Mongodb,Express,Mongoose,Transactions,在我的Node.js express应用程序中,我尝试通过mongoose进行事务处理。我成功连接到MongoDB,并尝试通过我应用程序中的另一个路由基于该连接启动事务。但不知何故,我无法通过 const db = mongoose.connection.db; // undefined const session = db.startSession() // Err : cannot read porperty startSession of undefined session.startT
const db = mongoose.connection.db; // undefined
const session = db.startSession() // Err : cannot read porperty startSession of undefined
session.startTransaction();
在我读到的将连接用作DB实例的某个地方,我检索了一个会话,但在该会话上没有名为startTransaction的方法
const session = mongoose.connection.startSession(); // works
session.startTransaction(); // Err : session.startTransaction is not a function
有人能给我解释一下如何在猫鼬上正确启动交易吗
提前谢谢
MongoDB版本:4.1.x
mongoose版本:5.4.X与其说是关于启动事务,不如说是关于如何构建模块。我建议您将数据库连接模块创建为一个脚本,然后从那里导出一个数据库,在那里您可以保存/更新对数据库的引用。类似于这个简单的例子:
// db module
const state = {
db: null
};
function connect() {
state.db = mongoose.createConnection(process.env.NODE_URL);
}
function getConnection() {
return Promise.resolve(state.db);
}
module.exports = {
connect,
getConnection,
}
然后在您的模块中,只需懒洋洋地获取以下内容:
let getConnection = require('./db'); // or wherever it is
module.exports = function(params, opts) {
return getConnection()
.then(db => db.startSession())
.then(session => session.startTransaction(/* ... */))
// ..
}
该模块是人为设计的,但它可能会帮助您开始工作 我将尝试一下,但是我是否被告知nodejs如何重用所需模块的相同实例?我的意思是,我假设我路由中的mongoose实例必须与我连接db的位置相同,并且我的mongoose实例中的连接设置为。。。如果不是这样的话,我必须重新考虑我的路由系统的基础设施。现在,这为我解决了问题。也许你可以再次帮助我,告诉我是否不建议使用mongoose.connect,而是像你那样使用mongoose.createConnection。mongoose.connect自动启动多个连接,我有一种不好的感觉,关于事务mongoose.connect没有本质上的不好,只是我的版本更灵活,它允许连接多个数据库或类似的东西。更明确的是,你有一个明确的连接对象,因此如果你在别处需要它,你必须提前计划如何共享它。通过明确,你不太可能犯错误,比如种族条件或类似情况。使用相同代码的人不必思考,所有的事情都是事先为他们准备好的。这包括六个月后的你自己——如果你用魔法做事,你可能会忘记它是如何工作的,通过显式地编写代码,许多带有清晰作业的小模块,并且只有这些作业,然后简单地将它们全部组合起来,从长远来看,这通常会更容易。但对于这一点,隐含的东西不起作用。例如,我可能想重新使用mongoose连接,但我不知道您是否初始化了它。对于许多较小的项目,这些项目不会持续很长时间或没有复杂的设置,使用默认设置,例如mongoose默认连接是很好的,哦,另一方面。它允许您更快地移动和编写更少的代码,任何熟悉该API的人都可以毫无问题地理解代码。因此,这也是一种有效的方法。