2016-02-05 70 views
1

我想重用MongoDB連接。我是知道的How to reuse mongodb connection in node.js 我想acheive的使用相同的承諾和蒙戈司機V2如何通過Promise重用MongoDB連接

目前我有連接到數據庫,每這使得它緩慢的請求。這是我的代碼

"use strict" 
var app = require('./utils/express')(); 
var mongodb = require('mongodb'); 

var MongoClient = mongodb.MongoClient; 
//Actually I 'am connecting to MongoLab 
var url = 'mongodb://localhost/my-mongo'; 

app.set('port', (process.env.PORT || 5000)); 

app.listen(app.get('port'), function() { 
    console.log('ParkMe app is running on port', app.get('port')); 
}); 


app.get('/location/create', function(req,res,next){ 
    MongoClient.connect(url).then(function(db) { 
    return db.collection('parkme_parkingLots').find({}).toArray().then(function (docs) { 
     return docs; 
    }); 
    }); 
}); 

我想要做的事,如:

"use strict" 
var app = require('./utils/express')(); 
var mongodb = require('mongodb'); 

var MongoClient = mongodb.MongoClient; 
var url = 'mongodb://nidhind:[email protected]:51635/my-mongo'; 
var db = MongoClient.connect(url).then(function(db) { 
    return db; 
}); 

app.set('port', (process.env.PORT || 5000)); 

app.listen(app.get('port'), function() { 
    console.log('ParkMe app is running on port', app.get('port')); 
}); 


app.get('/location/create', function(req,res,next){ 
    db.collection('parkme_parkingLots').find({}).toArray().then(function (docs) { 
    return docs; 
    }); 
}); 

回答

4

你幾乎沒有,有的只是一對夫婦的變化在你的代碼進行:

"use strict" 
var app = require('./utils/express')(); 
var mongodb = require('mongodb'); 

var MongoClient = mongodb.MongoClient; 
var url = 'mongodb://nidhind:[email protected]:51635/my-mongo'; 
// no need to call then() yet 
var connection = MongoClient.connect(url); 

app.set('port', (process.env.PORT || 5000)); 

app.listen(app.get('port'), function() { 
    console.log('ParkMe app is running on port', app.get('port')); 
}); 


app.get('/location/create', function(req, res, next) { 
    // the connection is opened once, use it at will 
    connection.then(function(db) { 
    db.collection('parkme_parkingLots').find({}).toArray().then(function(docs) { 
     return docs; 
    }); 
    }); 
}); 
0

以下是我如何用現代語法來做到這一點。

我在代碼中添加了一些註釋。

./db/mongodb.js

const MongoClient = require('mongodb').MongoClient 
const uri = 'mongodb://user:[email protected]:27017/dbName' 
let _db 

const connectDB = async (callback) => { 
    try { 
     MongoClient.connect(uri, (err, db) => { 
      _db = db 
      return callback(err) 
     }) 
    } catch (e) { 
     throw e 
    } 
} 

const getDB =() => _db 

const disconnectDB =() => _db.close() 

module.exports = { connectDB, getDB, disconnectDB } 

./index.js

// Load MongoDB utils 
const MongoDB = require('./db/mongodb') 
// Load queries & mutations 
const Users = require('./users') 

// Improve debugging 
process.on('unhandledRejection', (reason, p) => { 
    console.log('Unhandled Rejection at:', p, 'reason:', reason) 
}) 

const seedUser = { 
    name: 'Bob Alice', 
    email: '[email protected]', 
    bonusSetting: true 
} 

// Connect to MongoDB and put server instantiation code inside 
// because we start the connection first 
MongoDB.connectDB(async (err) => { 
    if (err) throw err 
    // Load db & collections 
    const db = MongoDB.getDB() 
    const users = db.collection('users') 

    try { 
     // Run some sample operations 
     // and pass users collection into models 
     const newUser = await Users.createUser(users, seedUser) 
     const listUsers = await Users.getUsers(users) 
     const findUser = await Users.findUserById(users, newUser._id) 

     console.log('CREATE USER') 
     console.log(newUser) 
     console.log('GET ALL USERS') 
     console.log(listUsers) 
     console.log('FIND USER') 
     console.log(findUser) 
    } catch (e) { 
     throw e 
    } 

    const desired = true 
    if (desired) { 
     // Use disconnectDB for clean driver disconnect 
     MongoDB.disconnectDB() 
     process.exit(0) 
    } 
    // Server code anywhere above here inside connectDB() 
}) 

./users/index.js

const ObjectID = require('mongodb').ObjectID 

// Notice how the users collection is passed into the models 
const createUser = async (users, user) => { 
    try { 
     const results = await users.insertOne(user) 
     return results.ops[0] 
    } catch (error) { 
     throw error 
    } 
} 

const getUsers = async (users) => { 
    try { 
     const results = await users.find().toArray() 
     return results 
    } catch (error) { 
     throw error 
    } 
} 

const findUserById = async (users, id) => { 
    try { 
     if (!ObjectID.isValid(id)) throw 'Invalid MongoDB ID.' 
     const results = await users.findOne(ObjectID(id)) 
     return results 
    } catch (error) { 
     throw error 
    } 
} 

// Export garbage as methods on the User object 
module.exports = { createUser, getUsers, findUserById }