当前位置: 首页 > 知识库问答 >
问题:

在NodeJs中处理MongoDB全局连接的最佳方法是什么

楚翰
2023-03-14

我使用Node Mongo Native并试图设置一个全局连接变量,但我对两种可能的解决方案感到困惑。你们能帮我找出哪一个是好的吗?1.解决方案(这很糟糕,因为每个请求都会尝试创建新连接。)

var express = require('express');  
var app = express();  
var MongoClient = require('mongodb').MongoClient;  
var assert = require('assert');

// Connection URL
var url = '[connectionString]]';

// start server on port 3000
app.listen(3000, '0.0.0.0', function() {  
  // print a message when the server starts listening
  console.log("server starting");
});

// Use connect method to connect to the server when the page is requested
app.get('/', function(request, response) {  
  MongoClient.connect(url, function(err, db) {
    assert.equal(null, err);
    db.listhtml" target="_blank">Collections({}).toArray(function(err, collections) {
        assert.equal(null, err);
        collections.forEach(function(collection) {
            console.log(collection);
        });
        db.close();
    })
    response.send('Connected - see console for a list of available collections');
  });
});

解决方案(在app init连接并将连接字符串分配给全局变量)。但我认为将连接字符串指定给全局变量不是一个好主意。

var mongodb;var url='[connectionString]';MongoClient。connect(url,function(err,db){
assert.equal(null,err);mongodb=db;});

我想在应用程序初始化时创建一个连接,并在整个应用程序生命周期内使用。

你们能帮帮我吗?谢谢

共有3个答案

杜海
2023-03-14

我就是这样做的。

// custom class
const MongoClient = require('mongodb').MongoClient
const credentials = "mongodb://user:pass@mongo"

class MDBConnect {
    static connect (db, collection) {
        return MongoClient.connect(credentials)
            .then( client => {
                return client.db(db).collection(collection);
            })
            .catch( err => { console.log(err)});
    }
    static findOne(db, collection, query) {
        return MDBConnect.connect(db,collection)
            .then(c => {
                return c.findOne(query)
                            .then(result => {
                                return result;
                            });
            })
    }
    // create as many as you want
    //static find(db, collection, query)
    //static insert(db, collection, query)
    // etc etc etc
}
module.exports = MDBConnect;


// in the route file
var express = require('express');
var router = express.Router();
var ObjectId = require('mongodb').ObjectId; 
var MDBConnect =  require('../storage/MDBConnect');

// Usages
router.get('/q/:id', function(req, res, next) {
    let sceneId = req.params.id;
    
    // user case 1
    MDBConnect.connect('gameapp','scene')
        .then(c => {
            c.findOne({_id: ObjectId(sceneId)})
                .then(result => {
                    console.log("result: ",result);
                    res.json(result);
                })
        });
    // user case 2, with query
    MDBConnect.findOne('gameapp','scene',{_id: ObjectId(sceneId)})
        .then(result => {
            res.json(result);
        });
});
白念
2023-03-14

另一个更简单的方法是利用Express的内置功能在应用程序中的路线和模块之间共享数据。有一个叫做app的对象。当地人。我们可以将属性附加到它,并从我们的路线内部访问它。要使用它,请在应用程序中实例化mongo连接。js文件。

var app = express();

MongoClient.connect('mongodb://localhost:27017/')
.then(client =>{
  const db = client.db('your-db');
  const collection = db.collection('your-collection');
  app.locals.collection = collection;
});
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              // view engine setup
app.set('views', path.join(__dirname, 'views'));

现在,您可以通过req在路由中访问该数据库连接,或者您希望在模块周围共享的任何其他数据。应用程序。本地人如下所示,无需创建和要求额外的模块。

app.get('/', (req, res) => {
  const collection = req.app.locals.collection;
  collection.find({}).toArray()
  .then(response => res.status(200).json(response))
  .catch(error => console.error(error));
});

此方法可确保在应用期间打开数据库连接,除非您选择随时关闭它。req.app.locals.your-集合可轻松访问该连接,并且不需要创建任何其他模块。

冯卓
2023-03-14

创建一个连接单例模块来管理应用程序数据库连接。

MongoClient不提供单例连接池,因此您不希望在应用程序中重复调用MongoClient.connect()。包装mongo客户端的单例类适用于我见过的大多数应用程序。

const MongoClient = require('mongodb').MongoClient

class Connection {

    static async open() {
        if (this.db) return this.db
        this.db = await MongoClient.connect(this.url, this.options)
        return this.db
    }

}

Connection.db = null
Connection.url = 'mongodb://127.0.0.1:27017/test_db'
Connection.options = {
    bufferMaxEntries:   0,
    reconnectTries:     5000,
    useNewUrlParser:    true,
    useUnifiedTopology: true,
}

module.exports = { Connection }

只要你需要('./Connection')连接。open()方法和连接将可用。db属性(如果已初始化)。

const router = require('express').Router()
const { Connection } = require('../lib/Connection.js')

// This should go in the app/server setup, and waited for.
Connection.open()

router.get('/files', async (req, res) => {
   try {
     const files = await Connection.db.collection('files').find({})
     res.json({ files })
   }
   catch (error) {
     res.status(500).json({ error })
   }
})

module.exports = router
 类似资料:
  • 问题内容: 我使用Node-Mongo-Native并尝试设置全局连接变量,但是我对两种可能的解决方案感到困惑。你们可以帮我选哪一个是好人吗?1.解决方案(这很糟糕,因为每个请求都将尝试创建新的连接。) 解决方案(在应用程序初始化时进行连接并将连接字符串分配给全局变量)。但我认为将连接字符串分配给全局变量不是一个好主意。 var mongodb; var url =’[connectionStri

  • 问题内容: 我使用10gen的本机node.js驱动器将mongodb(2.2.2)与node.js一起使用。 起初一切顺利。但是当涉及到并发基准测试部分时,会发生很多错误。频繁进行1000次并发连接/关闭可能会导致mongodb拒绝任何进一步的请求,并出现以下错误: 另外,如果许多客户端在没有显式关闭的情况下关闭,则mongodb将花费几分钟的时间来检测并关闭它们。这也将导致类似的连接问题。(使

  • 我试试看。js与mongodb(2.2.2)一起使用本机节点。js drive by 10gen。 起初一切都很顺利。但在并发基准测试部分,出现了很多错误。频繁连接/关闭1000次并发可能会导致mongodb拒绝任何进一步的请求,错误如下: 此外,如果很多客户端在没有显式关闭的情况下关闭,mongodb需要几分钟来检测并关闭它们。这也会导致类似的连接问题。(使用/var/log/mongodb/m

  • 问题内容: 我有一个方法可以执行一些超时任务。我使用ExecutorServer.submit()获取Future对象,然后使用超时调用future.get()。这工作正常,但是我的问题是处理可能由我的任务引发的检查异常的最佳方法。以下代码可以正常工作,并保留检查的异常,但是如果方法签名中的检查的异常列表发生更改,则显得非常笨拙且容易中断。 对于如何解决这个问题,有任何的建议吗?我需要以Java

  • 问题内容: 我有mongodb和NodeJs。通过mongoosejs完成连接。 开发Ajax Infinity滚动的最佳方法是什么?我应该使用极限和偏移量吗? 问题答案: 当您对数据集进行分页时,“跳过并限制”方法不是很有效。它实际上是Shlemiel Painter的算法 。 范围查询效率更高(当索引支持时)。例如,假设您正在显示推文。您的页面大小是20,您在第1000页上,并且想要加载第10

  • 问题内容: 我已经阅读了一些有关如何将Mongo与Node结合使用的指南,它们似乎都以不同的方式连接到数据库。一种对我有效的特定方式是: 但是,这对我来说似乎效率低下/很奇怪,每当出现时,我就不得不重新连接到数据库,例如用于创建新用户或检索信息。 似乎更适合我的另一种方法是 我已经看到有几个网站可以按照这些方式进行操作,但是我个人无法满足上述要求。我一直在服务器端收到错误消息。因此,我的问题是,如