问题描述
我正在尝试使用猫鼬实现用于MongoDB连接的通用模块。并希望将其他应用程序中的连接用于数据库操作。但是在尝试使用通用数据库模块时面临问题。创建数据库连接后,操作被暂停/挂起。这是我的代码库。
当我使用模块特定的dababase连接时,它工作正常,但是当我使用公共数据库连接时,它挂起了
公共数据库模块
'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将基础连接传递到模块中的模型,而用户没有真正了解正在发生的事情。这就是为什么您无需自己创建模型对象或将db连接对象传递给它就可以执行MyModel.find()之类的魔术东西的原因。
但是,如果您的数据库连接位于另一个模块中,则Mongoose将无法在模型与MongoDB客户端连接之间建立那些连接,因为模型不再注册在实际连接的mongoose对象上,并且结果,您使用模型提出的任何请求都会中断,因为它们将始终尝试通过模块中的对象进行连接。
还有其他原因导致此操作不起作用,也不应这样做。您不应该能够拆分客户端。这样做会使不清楚沿着客户端的通信来自何处或去向何处。您可以更改功能以使其返回已建立的客户端连接。但是您的猫鼬模型仍然无法使用。您将只剩下原始的mongodb。如果您想这样做,则最好卸载Mongoose并使用mongodb库。最终,从共享模块中初始化连接并不会带来任何好处。初始化连接只是几行代码。
我怀疑这是您要共享的连接,而是模型(我在猜测)。您可以将它们放在共享模块中,并将它们作为一种将给定Mongoose实例注入模型的连接器函数导出。参见:Defining Mongoose Models in Separate Module。