Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js mongoose在不同的路由上正确启动事务_Node.js_Mongodb_Express_Mongoose_Transactions - Fatal编程技术网

Node.js mongoose在不同的路由上正确启动事务

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

在我的Node.js express应用程序中,我尝试通过mongoose进行事务处理。我成功连接到MongoDB,并尝试通过我应用程序中的另一个路由基于该连接启动事务。但不知何故,我无法通过

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的人都可以毫无问题地理解代码。因此,这也是一种有效的方法。