diff --git a/package.json b/package.json index 42551a5fc1..67f89795b0 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "lodash": "4.17.4", "lru-cache": "4.1.1", "mime": "2.1.0", - "mongodb": "2.2.33", + "mongodb": "3.0.1", "multer": "1.3.0", "parse": "1.11.0", "pg-promise": "7.3.2", diff --git a/src/Adapters/Files/GridStoreAdapter.js b/src/Adapters/Files/GridStoreAdapter.js index 6814297036..744dff4b2d 100644 --- a/src/Adapters/Files/GridStoreAdapter.js +++ b/src/Adapters/Files/GridStoreAdapter.js @@ -21,7 +21,8 @@ export class GridStoreAdapter extends FilesAdapter { _connect() { if (!this._connectionPromise) { - this._connectionPromise = MongoClient.connect(this._databaseURI); + this._connectionPromise = MongoClient.connect(this._databaseURI) + .then((client) => client.db(client.s.options.dbName)); } return this._connectionPromise; } @@ -29,7 +30,7 @@ export class GridStoreAdapter extends FilesAdapter { // For a given config object, filename, and data, store a file // Returns a promise createFile(filename: string, data) { - return this._connect().then(database => { + return this._connect().then((database) => { const gridStore = new GridStore(database, filename, 'w'); return gridStore.open(); }).then(gridStore => { diff --git a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js index 5158e58c14..1f2ce4fcc0 100644 --- a/src/Adapters/Storage/Mongo/MongoStorageAdapter.js +++ b/src/Adapters/Storage/Mongo/MongoStorageAdapter.js @@ -116,7 +116,12 @@ export class MongoStorageAdapter { // encoded const encodedUri = formatUrl(parseUrl(this._uri)); - this.connectionPromise = MongoClient.connect(encodedUri, this._mongoOptions).then(database => { + this.connectionPromise = MongoClient.connect(encodedUri, this._mongoOptions).then(client => { + // Starting mongoDB 3.0, the MongoClient.connect don't return a DB anymore but a client + // Fortunately, we can get back the options and use them to select the proper DB. + // https://github.com/mongodb/node-mongodb-native/blob/2c35d76f08574225b8db02d7bef687123e6bb018/lib/mongo_client.js#L885 + const options = client.s.options; + const database = client.db(options.dbName); if (!database) { delete this.connectionPromise; return; @@ -127,6 +132,7 @@ export class MongoStorageAdapter { database.on('close', () => { delete this.connectionPromise; }); + this.client = client; this.database = database; }).catch((err) => { delete this.connectionPromise; @@ -137,10 +143,10 @@ export class MongoStorageAdapter { } handleShutdown() { - if (!this.database) { + if (!this.client) { return; } - this.database.close(false); + this.client.close(false); } _adaptiveCollection(name: string) { @@ -505,26 +511,28 @@ export class MongoStorageAdapter { } _parseReadPreference(readPreference) { - if (readPreference) { - switch (readPreference) { - case 'PRIMARY': - readPreference = ReadPreference.PRIMARY; - break; - case 'PRIMARY_PREFERRED': - readPreference = ReadPreference.PRIMARY_PREFERRED; - break; - case 'SECONDARY': - readPreference = ReadPreference.SECONDARY; - break; - case 'SECONDARY_PREFERRED': - readPreference = ReadPreference.SECONDARY_PREFERRED; - break; - case 'NEAREST': - readPreference = ReadPreference.NEAREST; - break; - default: - throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Not supported read preference.'); - } + switch (readPreference) { + case 'PRIMARY': + readPreference = ReadPreference.PRIMARY; + break; + case 'PRIMARY_PREFERRED': + readPreference = ReadPreference.PRIMARY_PREFERRED; + break; + case 'SECONDARY': + readPreference = ReadPreference.SECONDARY; + break; + case 'SECONDARY_PREFERRED': + readPreference = ReadPreference.SECONDARY_PREFERRED; + break; + case 'NEAREST': + readPreference = ReadPreference.NEAREST; + break; + case undefined: + // this is to match existing tests, which were failing as mongodb@3.0 don't report readPreference anymore + readPreference = ReadPreference.PRIMARY; + break; + default: + throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Not supported read preference.'); } return readPreference; }