node.js - node.js - 在NodeJs中,处理Mongodb全局连接的最佳方法是什么?

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');


 });


});



解决方案(在app init连接并将连接字符串分配给全局变量),

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

我想在应用程序初始化时创建连接,并在应用程序生存期中使用。

谢谢。

时间:

创建Connection类以管理应用程序的数据库连接。


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 }



到处require('./Connection.js')Connection.connectToMongo()方法将可用,如果Connection.db属性已经初始化,则它也将可用。


const router = require('express').Router()


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



// Better if this goes in your server setup somewhere and waited for.


Connection.connectToMongo()



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




 // 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);


 });


 });



模块版本^3.1.8

将连接初始化为promise:


const MongoClient = require('mongodb').MongoClient


const uri = 'mongodb://...'


const client = new MongoClient(uri)


const connection = client.connect()



然后在希望对数据库执行操作时调用连接:


app.post('/insert', (req, res) => {


 const connect = connection


 connect.then(() => {


 const doc = { id: 3 }


 const db = client.db('database_name')


 const coll = db.collection('collection_name')


 coll.insertOne(doc, (err, result) => {


 if(err) throw err


 })


 })


}) 



...