繁体   English   中英

如何在 Nodejs 中重用 MongoDB 连接

[英]How can I reuse MongoDB connections in Nodejs

我正在尝试在 NodeJS 中重用 MongoDB 连接。 我正在使用本机 MongoDB 驱动程序 v3.6.6。 我已经阅读并使用了这个问题这个问题和许多其他喜欢它的代码。 我的 app.js 如下:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var session = require('express-session');
var mongoCon=require('./modules/mongoCon');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var config=require('./config.json');
var app = express();
mongoCon.connectDb(function(db){
  app.use(session({"secret": config["sessionSecret"]}));

  // view engine setup
  app.set('views', path.join(__dirname, 'views'));
  app.set('view engine', 'ejs');

  app.use(logger('dev'));
  app.use(express.json());
  app.use(express.urlencoded({ extended: false }));
  app.use(cookieParser());
  app.use(express.static(path.join(__dirname, 'public')));

  app.use('/', indexRouter);
  app.use('/users', usersRouter);

  // catch 404 and forward to error handler
  app.use(function(req, res, next) {
    next(createError(404));
  });

  // error handler
  app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
  });
})
module.exports = app;

我的 mongoCon 文件如下:

const MongoClient = require( 'mongodb' ).MongoClient;
const mongoCredentials=require('./../config.json')["mongoCredentials"];
var url;
url = "mongodb://"+mongoCredentials["url"]+":"+mongoCredentials["port"];

var _db;
var client=new MongoClient(url,{ useNewUrlParser: true,useUnifiedTopology: true });

module.exports=
{
  connectDb: async function(func=null){
    await client.connect();
      this._db  = await client.db(mongoCredentials["db"]);
      console.log("Database Connected");
      if(func!=null){
        func(this._db)
      }
      return this._db;
  },
  getDb: async function(func=null){
    if(this._db){
      if(func!=null){
        func(this._db)
      }
      return this._db;
    }
    else{
      await this.connectDb();
      if(func!=null){
        func(this._db)
      }
      return this._db;
    }
  }
}

当我想重用连接时,我调用 MongoCon.getDb()。 但这会打开一个新的数据库连接而不是重用它。 如果我在 getDb() 中删除对 __db 的检查,它会返回未定义。 我不知道如何解决这个问题。

尝试仅导出连接实例而不是 connectDb 和 getDb,您可以执行以下操作:

const { MongoClient } = require( 'mongodb' );
const client = new MongoClient(uri);

const DbConnection = () =>  {

    var db = null;
    var model = null;

    const getDBConnection = async () => {
        try {
            let url = 'mongodb://"+mongoCredentials["url"]+":"+mongoCredentials["port"';
            let db = await client.connect(url, {useNewUrlParser:true, useUnifiedTopology:true});
            return db
        } catch (e) {
            return e;
        }
    }

   const getInstance = async () => {
        try {
            if (db != null) {
                console.log(" db connection is already alive");
                return db;
            } else {
                console.log('getting new connection');
                db = await getDBConnection();
                return db;
            }
        } catch (e) {
            return e;
        }
    }

    return getInstance;
}

export default {db: DbConnection()}

在您导入的文件中:

const dbConnection = require('path to file');

const dbInstance =  async() => {
   const db = await dbConnection();
}

使用 mongoose 并从 mongoose 导出连接并在文件之间共享

const mongoose = require("mongoose");
exports.isReady = false;
exports.connection = null;

mongoose.connect(config.mDB.serverUrl, { useFindAndModify: false, useUnifiedTopology: true, useNewUrlParser: true })
    .then(function (res) {
        
        // console.log('Succeeded connected to: ' + config.mDB.serverUrl);
        exports.isReady = true;
        exports.connection = res;
        exports.con = res.connection
    })

    .catch(function (err) {
       
        // console.error(err)
        // console.log('ERROR connecting to: ' + config.mDB.serverUrl, + '. ' + err);
    })

在另一个文件中将其导入为 DB

var DB = require('./DB')
DB.con.collection('test').findAll({}).toArray()

暂无
暂无

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

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