Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用公共模块的数据库连接不工作[mongoose和mongodb]_Node.js_Mongodb_Rest_Mongoose_Database Connection - Fatal编程技术网

Node.js 使用公共模块的数据库连接不工作[mongoose和mongodb]

Node.js 使用公共模块的数据库连接不工作[mongoose和mongodb],node.js,mongodb,rest,mongoose,database-connection,Node.js,Mongodb,Rest,Mongoose,Database Connection,我正在尝试使用mongoose实现MongoDB连接的通用模块。并希望在其他应用程序中使用该连接进行数据库操作。但在尝试使用公共数据库模块时遇到了问题。创建数据库连接后,操作暂停/挂起。这是我的代码库 当我使用特定于模块的数据库连接时,它工作正常,但当我使用公共数据库连接时,它挂起了 通用数据库模块 'use strict' const mongoose = require('mongoose'); const DBOptions = require('./DBOption'); r

我正在尝试使用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()之类的神奇操作,而无需自己创建模型对象,或向其传递db连接对象

但是,如果您的db连接位于另一个模块中,Mongoose将无法在您的模型和MongoDB客户端连接之间建立这些连接,因为模型不再在实际连接的Mongoose对象上注册,因此,您使用模型发出的任何请求都将中断,因为他们总是试图通过模块中的对象进行连接

不过,还有其他原因说明这不会也不应该起作用。你不能分割客户。这样做会使我们不清楚客户之间的沟通来自何方或将走向何方。您可以更改函数,使其返回已建立的客户端连接。但是你的猫鼬模型还是不起作用。你只剩下原始的mongodb了。如果您想这样做,您最好卸载Mongoose并使用mongodb库。最终,在共享模块中初始化连接不会带来任何好处。初始化连接只是几行代码


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

谢谢查尔斯。。谢谢。。现在我明白了。我将更改实现。很高兴我能帮助@ajoysinha