Node.js 使用公共模块的数据库连接不工作[mongoose和mongodb]
我正在尝试使用mongoose实现MongoDB连接的通用模块。并希望在其他应用程序中使用该连接进行数据库操作。但在尝试使用公共数据库模块时遇到了问题。创建数据库连接后,操作暂停/挂起。这是我的代码库 当我使用特定于模块的数据库连接时,它工作正常,但当我使用公共数据库连接时,它挂起了 通用数据库模块Node.js 使用公共模块的数据库连接不工作[mongoose和mongodb],node.js,mongodb,rest,mongoose,database-connection,Node.js,Mongodb,Rest,Mongoose,Database Connection,我正在尝试使用mongoose实现MongoDB连接的通用模块。并希望在其他应用程序中使用该连接进行数据库操作。但在尝试使用公共数据库模块时遇到了问题。创建数据库连接后,操作暂停/挂起。这是我的代码库 当我使用特定于模块的数据库连接时,它工作正常,但当我使用公共数据库连接时,它挂起了 通用数据库模块 'use strict' const mongoose = require('mongoose'); const DBOptions = require('./DBOption'); r
'use strict'
const mongoose = require('mongoose');
const DBOptions = require('./DBOption');
require("dotenv").config();
mongoose.Promise = global.Promise;
let isConnected;
const connectToDatabase = (MONGODB_URL) => {
if (isConnected) {
console.log('using existing database connection');
return Promise.resolve();
}
console.log('using new database connection');
console.log('DBOptions >> '+JSON.stringify(DBOptions));
return mongoose.connect(MONGODB_URL, DBOptions)
.then(db => {
console.log('db.connections[0].readyState >> '+db.connections[0].readyState);
isConnected = db.connections[0].readyState;
});
};
module.exports = connectToDatabase;
API控制器
const dbConnection = require('../DB/connection') // Internal Class
const DBConnection = require('as-common-util').connectToDatabase; // Common Class
/**
*
*/
app.get('/usr/alluser', async (req, res) => {
try {
//await dbConnection(process.env.MONGODB_URL) // This is working
await DBConnection(process.env.MONGODB_URL) // Code is hanging for this
let allUsers = await UserService.getAllUser()
console.log("All Users >> " + allUsers)
if (allUsers) {
return res.status(200).send(
new APIResponse({
success: true,
obj: allUsers
})
)
}
} catch (error) {
console.log(error)
}
})
它挂在下面的位置
using new database connection
DBOptions >>
{"useNewUrlParser":true,"useUnifiedTopology":true,"useCreateIndex":true,"useFindAndModify":false,"autoIndex":false,"poolSize":10,"serverSelectionTimeoutMS":5000,"socketTimeoutMS":45000,"family":4}
db.connections[0].readyState >> 1
我不明白为什么相同的代码不适用于公共模块。这种模式不是Mongoose的使用方式。在引擎盖下,Mongoose将底层连接传递到模块中的模型,而用户对正在发生的事情一无所知。这就是为什么您可以执行MyModel.find()之类的神奇操作,而无需自己创建模型对象,或向其传递db连接对象 但是,如果您的db连接位于另一个模块中,Mongoose将无法在您的模型和MongoDB客户端连接之间建立这些连接,因为模型不再在实际连接的Mongoose对象上注册,因此,您使用模型发出的任何请求都将中断,因为他们总是试图通过模块中的对象进行连接 不过,还有其他原因说明这不会也不应该起作用。你不能分割客户。这样做会使我们不清楚客户之间的沟通来自何方或将走向何方。您可以更改函数,使其返回已建立的客户端连接。但是你的猫鼬模型还是不起作用。你只剩下原始的mongodb了。如果您想这样做,您最好卸载Mongoose并使用mongodb库。最终,在共享模块中初始化连接不会带来任何好处。初始化连接只是几行代码
我怀疑你想分享的是联系,而不是模型(我猜)。您可以将它们放在共享模块中,并将它们导出为一种连接器函数,将给定的Mongoose实例注入到模型中。请参阅:。谢谢查尔斯。。谢谢。。现在我明白了。我将更改实现。很高兴我能帮助@ajoysinha