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

Nit*_*inD 6 mongodb node.js express node-mongodb-native

我使用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.listCollections({}).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');
  });
});
Run Code Online (Sandbox Code Playgroud)
  1. 解决方案(在app init连接并将连接字符串分配给全局变量).但我相信将连接字符串分配给全局变量并不是一个好主意.

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

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

你能帮助我吗?谢谢.

Mat*_*att 20

创建一个Connection类来管理apps数据库连接.

const MongoClient = require('mongodb').MongoClient

class Connection {
    static connectToMongo() {
        if ( this.db ) return Promise.resolve(this.db)
        return MongoClient.connect(this.url, this.options)
            .then(db => this.db = db)
    }
}

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

module.exports = { Connection }
Run Code Online (Sandbox Code Playgroud)

无论你require('./Connection.js')到哪里,Connection.connectToMongo()方法都将可用,Connection.db财产也是如此.

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

router.get('/files', (req, res) => {
   Connection.db.collection('files').find({})
     .then(files => res.json({ files: files })
     .catch(err => res.json({ error: err })
})

module.exports = router
Run Code Online (Sandbox Code Playgroud)

  • 您只需在应用程序初始化中的“ server.listen”或“ app.listen”附近调用一次“ connect”即可。然后,该类充当单例,在每个需要连接类的地方,都可以使用相同的(已连接)数据库属性。 (2认同)