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

问题描述

我正在尝试使用猫鼬实现用于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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...