繁体   English   中英

使用通用模块的数据库连接不起作用 [ mongoose 和 mongodb ]

[英]Database Connection using common module is not working [ mongoose and mongodb ]

我正在尝试使用 mongoose 为 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 Controller

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)
  }
})

它挂在下面的 position

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

我很困惑为什么相同的代码不适用于通用模块。

这种模式不是 ZCCADCDEDB567ABAE643E15DCF0974E503Z 的用途。 在引擎盖下,Mongoose 将底层连接传递给模块中的模型,而用户并不真正了解正在发生的事情。 这就是为什么您无需自己创建 model object 或将数据库连接 object 传递给它即可执行 MyModel.find() 之类的魔术的原因。

If your db connection is in another module though, Mongoose won't be able to make those connections between your models and the MongoDB client connection since the models are no longer being registered on the mongoose object that is actually connected, and as a result,您使用模型提出的任何请求都会中断,因为它们将始终尝试通过模块中的 object 进行连接。

还有其他原因导致这不起作用,也不应该起作用。 您不应该能够拆分客户端。 这样做会使客户的通信从哪里来或去往哪里变得不清楚。 您可以更改 function 以使其返回已建立的客户端连接。 但是您的 Mongoose 型号仍然无法工作。 您将只剩下原始 mongodb。 如果你想这样做,你不妨卸载 ZCCADDEDB567ABAE643E15DCF0974E503Z 并使用 mongodb 库。 最终,在共享模块中初始化连接并没有真正获得任何好处。 初始化连接只是几行代码。

我怀疑这是您想要分享的联系,而不是模型(我猜)。 您可以将它们放在共享模块中,并将它们导出为一种连接器 function,它将给定的 Mongoose 实例注入模型。 请参阅: 在单独的模块中定义 Mongoose 模型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM