From 9c3bcb88aba3cc67f2f624f53214d6788f8a412f Mon Sep 17 00:00:00 2001 From: rohantarai <16543074+rohantarai@users.noreply.github.com> Date: Wed, 27 Nov 2019 11:38:46 +0530 Subject: [PATCH] updated to support mongodb v3.2 and above --- lib/databases/mongodb.js | 44 ++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/lib/databases/mongodb.js b/lib/databases/mongodb.js index b46054a..25683b0 100644 --- a/lib/databases/mongodb.js +++ b/lib/databases/mongodb.js @@ -6,7 +6,7 @@ var util = require('util'), isNew = mongoVersion.indexOf('1.') !== 0, ObjectID = isNew ? mongo.ObjectID : mongo.BSONPure.ObjectID, _ = require('lodash'); - + function cleanSessionData(json) { if (!json) { return json; @@ -41,18 +41,21 @@ var MongoSessionStore = function (options) { _.defaults(options, defaults); var defaultOpt = { - ssl: false + // ssl is by default false in node-mongodb-native driver v1.4.x / v2.2 and above + // ssl: false }; options.options = options.options || {}; if (isNew) { - defaultOpt.autoReconnect = false; + // autoReconnect needs to be true to reconnect on failure, by default it is true in node-mongodb-native driver v2.2 and above + // defaultOpt.autoReconnect = false; defaultOpt.useNewUrlParser = true; defaultOpt.useUnifiedTopology = true; _.defaults(options.options, defaultOpt); } else { - defaultOpt.auto_reconnect = false; + // auto_reconnect not required as by default it is false in node-mongodb-native driver v1.4.x + // defaultOpt.auto_reconnect = false; _.defaults(options.options, defaultOpt); } @@ -69,15 +72,19 @@ _.extend(MongoSessionStore.prototype, { var options = this.options; var connectionUrl; + var client; + // for mongodb Atlas uri / local mongodb v3.2 and above replicset uri if (options.url) { connectionUrl = options.url; - } else { + } + // for local mongodb v3.2 and above (not replicaset) + else { var members = options.servers ? options.servers - : [{host: options.host, port: options.port}]; + : [{ host: options.host, port: options.port }]; - var memberString = _(members).map(function(m) { return m.host + ':' + m.port; }); + var memberString = _(members).map(function (m) { return m.host + ':' + m.port; }); var authString = options.username && options.password ? options.username + ':' + options.password + '@' : ''; @@ -88,11 +95,10 @@ _.extend(MongoSessionStore.prototype, { connectionUrl = 'mongodb://' + authString + memberString + '/' + options.dbName + optionsString; } - var client; - + // for node-mongodb-native driver v2.2 and above if (mongo.MongoClient.length === 2) { client = new mongo.MongoClient(connectionUrl, options.options); - client.connect(function(err, cl) { + client.connect(function (err, cl) { if (err) { if (callback) callback(err); return; @@ -104,9 +110,11 @@ _.extend(MongoSessionStore.prototype, { } initDb(); }); - } else { + } + // for node-mongodb-native driver v1.4.x + else { client = new mongo.MongoClient(); - client.connect(connectionUrl, options.options, function(err, db) { + client.connect(connectionUrl, options.options, function (err, db) { if (err) { if (callback) callback(err); return; @@ -126,7 +134,7 @@ _.extend(MongoSessionStore.prototype, { var finish = function (err) { self.sessions = self.db.collection(options.collectionName); - self.sessions.ensureIndex({ expires: 1 }, { expireAfterSeconds: 0 }, function() {}); + self.sessions.createIndex({ expires: 1 }, { expireAfterSeconds: 0 }, function() {}); if (!err) { self.isConnected = true; self.emit('connect'); @@ -210,7 +218,7 @@ _.extend(MongoSessionStore.prototype, { if (!this.options.ignoreConcurrency) sess._hash = new ObjectID().toString(); - this.sessions.update(query, sess, { upsert: true, safe: true }, function(err, modifiedCount) { + this.sessions.updateOne(query, { $set: sess }, { upsert: true }, function(err, modifiedCount) { if (err && err.message && err.message.indexOf('duplicate key') > -1) { return callback(new Error('ConcurrencyError: Session was updated by someone else!')); } @@ -247,11 +255,11 @@ _.extend(MongoSessionStore.prototype, { }, destroy: function (sid, callback) { - this.sessions.remove({ _id: sid }, callback || function () {}); + this.sessions.deleteOne({ _id: sid }, callback || function () {}); }, length: function (callback) { - this.sessions.count(callback || function () {}); + this.sessions.estimatedDocumentCount(callback || function() {}); }, all: function (callback) { @@ -268,9 +276,9 @@ _.extend(MongoSessionStore.prototype, { }, clear: function (callback) { - this.sessions.remove(callback || function () {}); + this.sessions.deleteMany(callback || function() {}); } }); -module.exports = MongoSessionStore; +module.exports = MongoSessionStore; \ No newline at end of file