Skip to content

Commit 19e7407

Browse files
Marco129drew-gross
authored andcommitted
Return correct error when violating unique index (#1763)
1 parent 6cfcb4d commit 19e7407

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

spec/ParseAPI.spec.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
var DatabaseAdapter = require('../src/DatabaseAdapter');
66
var request = require('request');
77
const Parse = require("parse/node");
8+
let Config = require('../src/Config');
89

910
describe('miscellaneous', function() {
1011
it('create a GameScore object', function(done) {
@@ -1387,4 +1388,25 @@ describe('miscellaneous', function() {
13871388
})
13881389
});
13891390
});
1391+
1392+
it('fail when create duplicate value in unique field', (done) => {
1393+
let obj = new Parse.Object('UniqueField');
1394+
obj.set('unique', 'value');
1395+
obj.save().then(() => {
1396+
expect(obj.id).not.toBeUndefined();
1397+
let config = new Config('test');
1398+
return config.database.adapter.adaptiveCollection('UniqueField')
1399+
}).then(collection => {
1400+
return collection._mongoCollection.createIndex({ 'unique': 1 }, { unique: true })
1401+
}).then(() => {
1402+
let obj = new Parse.Object('UniqueField');
1403+
obj.set('unique', 'value');
1404+
return obj.save()
1405+
}).then(() => {
1406+
return Promise.reject();
1407+
}, error => {
1408+
expect(error.code === Parse.Error.DUPLICATE_VALUE);
1409+
done();
1410+
});
1411+
});
13901412
});

src/Adapters/Storage/Mongo/MongoStorageAdapter.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,14 @@ export class MongoStorageAdapter {
166166
createObject(className, object, schemaController, parseFormatSchema) {
167167
const mongoObject = transform.parseObjectToMongoObjectForCreate(schemaController, className, object, parseFormatSchema);
168168
return this.adaptiveCollection(className)
169-
.then(collection => collection.insertOne(mongoObject));
169+
.then(collection => collection.insertOne(mongoObject))
170+
.catch(error => {
171+
if (error.code === 11000) { // Duplicate value
172+
throw new Parse.Error(Parse.Error.DUPLICATE_VALUE,
173+
'A duplicate value for a field with unique values was provided');
174+
}
175+
return Promise.reject(error);
176+
});
170177
}
171178

172179
// Remove all objects that match the given parse query. Parse Query should be in Parse Format.

0 commit comments

Comments
 (0)