使用公共模块的数据库连接不工作 [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.