使用公共模块的数据库连接不工作 [mongoose 和 mongodb]
Database Connection using common module is not working [ mongoose and mongodb ]
我正在尝试使用 mongoose 为 MongoDB 连接实现一个通用模块。并希望在其他应用程序中使用连接进行数据库操作。但在尝试使用通用数据库模块时遇到问题。创建数据库连接后操作停止/挂起。这是我的代码库。
当我使用特定于模块的数据库连接时,它工作正常,但是当我使用普通数据库连接时它挂起
公共数据库模块
'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() 这样神奇的事情,而不必自己创建模型对象,或将数据库连接对象传递给它。
如果您的数据库连接在另一个模块中,Mongoose 将无法在您的模型和 MongoDB 客户端连接之间建立这些连接,因为模型不再在 mongoose 对象上注册实际上已连接,因此,您使用模型发出的任何请求都将中断,因为它们将始终尝试通过您模块中的对象进行连接。
虽然这不会也不应该起作用,但还有其他原因。您不应该能够拆分客户。这样做会使客户之间的通信从哪里来或去哪里变得不清楚。您可以更改函数以使其 return 成为已建立的客户端连接。但是您的 Mongoose 模型仍然无法正常工作。您将只剩下原始 mongodb。如果你想这样做,你最好卸载 Mongoose 并使用 mongodb 库。最终,您不会从共享模块中初始化连接中获得任何好处。初始化连接只是几行代码。
我怀疑你想分享的是连接,而不是模型(我猜)。您可以将它们放在一个共享模块中,并将它们导出为一种连接器函数,将给定的 Mongoose 实例注入到模型中。参见:Defining Mongoose Models in Separate Module.
我正在尝试使用 mongoose 为 MongoDB 连接实现一个通用模块。并希望在其他应用程序中使用连接进行数据库操作。但在尝试使用通用数据库模块时遇到问题。创建数据库连接后操作停止/挂起。这是我的代码库。
当我使用特定于模块的数据库连接时,它工作正常,但是当我使用普通数据库连接时它挂起
公共数据库模块
'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() 这样神奇的事情,而不必自己创建模型对象,或将数据库连接对象传递给它。
如果您的数据库连接在另一个模块中,Mongoose 将无法在您的模型和 MongoDB 客户端连接之间建立这些连接,因为模型不再在 mongoose 对象上注册实际上已连接,因此,您使用模型发出的任何请求都将中断,因为它们将始终尝试通过您模块中的对象进行连接。
虽然这不会也不应该起作用,但还有其他原因。您不应该能够拆分客户。这样做会使客户之间的通信从哪里来或去哪里变得不清楚。您可以更改函数以使其 return 成为已建立的客户端连接。但是您的 Mongoose 模型仍然无法正常工作。您将只剩下原始 mongodb。如果你想这样做,你最好卸载 Mongoose 并使用 mongodb 库。最终,您不会从共享模块中初始化连接中获得任何好处。初始化连接只是几行代码。
我怀疑你想分享的是连接,而不是模型(我猜)。您可以将它们放在一个共享模块中,并将它们导出为一种连接器函数,将给定的 Mongoose 实例注入到模型中。参见:Defining Mongoose Models in Separate Module.