From c6c9c97b54f945d392e03ff6866c52f7e1a2c1d3 Mon Sep 17 00:00:00 2001 From: Jeremy Pease Date: Wed, 1 Jun 2016 10:28:06 -0400 Subject: [PATCH] Allow custom error codes with response.error from Cloud Code functions and before/after hooks (#1955) --- spec/CloudCode.spec.js | 17 +++++++++++++++++ spec/ParseAPI.spec.js | 30 ++++++++++++++++++++++++++++++ src/Routers/FunctionsRouter.js | 8 ++++++-- src/triggers.js | 8 ++++++-- 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/spec/CloudCode.spec.js b/spec/CloudCode.spec.js index c6bc8b25..875a6c76 100644 --- a/spec/CloudCode.spec.js +++ b/spec/CloudCode.spec.js @@ -64,6 +64,23 @@ describe('Cloud Code', () => { }) }); + it('beforeSave rejection with custom error code', function(done) { + Parse.Cloud.beforeSave('BeforeSaveFailWithErrorCode', function (req, res) { + res.error(999, 'Nope'); + }); + + var obj = new Parse.Object('BeforeSaveFailWithErrorCode'); + obj.set('foo', 'bar'); + obj.save().then(function() { + fail('Should not have been able to save BeforeSaveFailWithErrorCode class.'); + done(); + }, function(error) { + expect(error.code).toEqual(999); + expect(error.message).toEqual('Nope'); + done(); + }); + }); + it('basic beforeSave rejection via promise', function(done) { Parse.Cloud.beforeSave('BeforeSaveFailWithPromise', function (req, res) { var query = new Parse.Query('Yolo'); diff --git a/spec/ParseAPI.spec.js b/spec/ParseAPI.spec.js index 471bbea4..cd6b40e7 100644 --- a/spec/ParseAPI.spec.js +++ b/spec/ParseAPI.spec.js @@ -724,6 +724,36 @@ describe('miscellaneous', function() { }); }); + it('test cloud function error handling with custom error code', (done) => { + // Register a function which will fail + Parse.Cloud.define('willFail', (req, res) => { + res.error(999, 'noway'); + }); + Parse.Cloud.run('willFail').then((s) => { + fail('Should not have succeeded.'); + done(); + }, (e) => { + expect(e.code).toEqual(999); + expect(e.message).toEqual('noway'); + done(); + }); + }); + + it('test cloud function error handling with standard error code', (done) => { + // Register a function which will fail + Parse.Cloud.define('willFail', (req, res) => { + res.error('noway'); + }); + Parse.Cloud.run('willFail').then((s) => { + fail('Should not have succeeded.'); + done(); + }, (e) => { + expect(e.code).toEqual(Parse.Error.SCRIPT_FAILED); + expect(e.message).toEqual('noway'); + done(); + }); + }); + it('test beforeSave/afterSave get installationId', function(done) { let triggerTime = 0; Parse.Cloud.beforeSave('GameScore', function(req, res) { diff --git a/src/Routers/FunctionsRouter.js b/src/Routers/FunctionsRouter.js index ea614b49..dcf3e49c 100644 --- a/src/Routers/FunctionsRouter.js +++ b/src/Routers/FunctionsRouter.js @@ -21,8 +21,12 @@ export class FunctionsRouter extends PromiseRouter { } }); }, - error: function(error) { - reject(new Parse.Error(Parse.Error.SCRIPT_FAILED, error)); + error: function(code, message) { + if (!message) { + message = code; + code = Parse.Error.SCRIPT_FAILED; + } + reject(new Parse.Error(code, message)); } } } diff --git a/src/triggers.js b/src/triggers.js index 7988530a..8b393605 100644 --- a/src/triggers.js +++ b/src/triggers.js @@ -141,8 +141,12 @@ export function getResponseObject(request, resolve, reject) { } return resolve(response); }, - error: function(error) { - var scriptError = new Parse.Error(Parse.Error.SCRIPT_FAILED, error); + error: function(code, message) { + if (!message) { + message = code; + code = Parse.Error.SCRIPT_FAILED; + } + var scriptError = new Parse.Error(code, message); return reject(scriptError); } }