From 1ef8274b3e02fbb3f85d8d444f863046b9fed556 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Tue, 8 Dec 2020 10:54:41 -0500 Subject: [PATCH] fix(middleware): ensure sync errors in pre hooks always bubble up to the calling code Fix #9659 --- package.json | 2 +- test/document.test.js | 17 +++++++++++++++++ test/model.test.js | 8 ++++---- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 40fab63612e..6e7b401fbf7 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "@types/mongodb": "^3.5.27", "bson": "^1.1.4", - "kareem": "2.3.1", + "kareem": "2.3.2", "mongodb": "3.6.3", "mongoose-legacy-pluralize": "1.0.2", "mpath": "0.8.0", diff --git a/test/document.test.js b/test/document.test.js index 301cfab3f9f..dd4767d48d9 100644 --- a/test/document.test.js +++ b/test/document.test.js @@ -9788,4 +9788,21 @@ describe('document', function() { assert.ok(documentFromDefault === user); assert.equal(documentFromDefault.name, 'Hafez'); }); + + it('handles pre hook throwing a sync error (gh-9659)', function() { + const TestSchema = new Schema({ name: String }); + + TestSchema.pre('save', function() { + throw new Error('test err'); + }); + const TestModel = db.model('Test', TestSchema); + + return co(function*() { + const testObject = new TestModel({ name: 't' }); + + const err = yield testObject.save().then(() => null, err => err); + assert.ok(err); + assert.equal(err.message, 'test err'); + }); + }); }); diff --git a/test/model.test.js b/test/model.test.js index 8a54e946d65..9e43bc30396 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -1603,14 +1603,14 @@ describe('Model', function() { let docMiddleware = 0; let queryMiddleware = 0; - schema.pre('remove', { query: true }, function() { - assert.ok(this instanceof Model.Query); + schema.pre('remove', { query: true, document: false }, function() { ++queryMiddleware; + assert.ok(this instanceof Model.Query); }); - schema.pre('remove', { document: true }, function() { - assert.ok(this instanceof Model); + schema.pre('remove', { query: false, document: true }, function() { ++docMiddleware; + assert.ok(this instanceof Model); }); const Model = db.model('Test', schema);