diff --git a/spec/EnableExpressErrorHandler.spec.js b/spec/EnableExpressErrorHandler.spec.js new file mode 100644 index 0000000000..648e986c2a --- /dev/null +++ b/spec/EnableExpressErrorHandler.spec.js @@ -0,0 +1,66 @@ +const ParseServer = require("../lib/index"); +const express = require('express'); +const rp = require('request-promise'); + +describe('Enable express error handler', () => { + + it('should call the default handler in case of error, like updating a non existing object', done => { + const serverUrl = "http://localhost:12667/parse" + const appId = "anOtherTestApp"; + const masterKey = "anOtherTestMasterKey"; + let server; + + let lastError; + + const parseServer = ParseServer.ParseServer(Object.assign({}, + defaultConfiguration, { + appId: appId, + masterKey: masterKey, + serverURL: serverUrl, + enableExpressErrorHandler: true, + __indexBuildCompletionCallbackForTests: promise => { + promise.then(() => { + expect(Parse.applicationId).toEqual("anOtherTestApp"); + const app = express(); + app.use('/parse', parseServer); + + server = app.listen(12667); + + app.use(function (err, req, res, next) { + next; + lastError = err; + }) + + rp({ + method: 'PUT', + uri: serverUrl + '/classes/AnyClass/nonExistingId', + headers: { + 'X-Parse-Application-Id': appId, + 'X-Parse-Master-Key': masterKey + }, + body: { someField: "blablabla" }, + json: true + }).then(() => { + fail('Should throw error'); + }).catch(e => { + expect(e).toBeDefined(); + const reqError = e.error; + expect(reqError).toBeDefined(); + expect(lastError).toBeDefined(); + + expect(lastError.code).toEqual(101) + expect(lastError.message).toEqual('Object not found.') + + expect(lastError.code).toEqual(reqError.code); + expect(lastError.message).toEqual(reqError.error); + }).then(() => { + server.close(done); + }); + }) + } + } + )); + }); + +}); + diff --git a/src/Options/Definitions.js b/src/Options/Definitions.js index 8a58da95dc..6747fd59cc 100644 --- a/src/Options/Definitions.js +++ b/src/Options/Definitions.js @@ -262,6 +262,12 @@ module.exports.ParseServerOptions = { "action": parsers.booleanParser, "default": false }, + "enableExpressErrorHandler": { + "env": "PARSE_SERVER_ENABLE_EXPRESS_ERROR_HANDLER", + "help": "Enables the default express error handler for all errors", + "action": parsers.booleanParser, + "default": false + }, "objectIdSize": { "env": "PARSE_SERVER_OBJECT_ID_SIZE", "help": "Sets the number of characters in generated object id's, default 10", diff --git a/src/Options/index.js b/src/Options/index.js index e4f6c24dfb..247e008a06 100644 --- a/src/Options/index.js +++ b/src/Options/index.js @@ -114,6 +114,8 @@ export interface ParseServerOptions { cacheMaxSize : ?number; // = 10000 /* Use a single schema cache shared across requests. Reduces number of queries made to _SCHEMA. Defaults to false, i.e. unique schema cache per request. */ enableSingleSchemaCache: ?boolean; // = false + /* Enables the default express error handler for all errors */ + enableExpressErrorHandler: ?boolean; // = false /* Sets the number of characters in generated object id's, default 10 */ objectIdSize: ?number; // = 10 /* The port to run the ParseServer. defaults to 1337. diff --git a/src/middlewares.js b/src/middlewares.js index 0606ab8f38..77bca61b3c 100644 --- a/src/middlewares.js +++ b/src/middlewares.js @@ -284,6 +284,9 @@ export function handleParseErrors(err, req, res, next) { res.status(httpStatus); res.json({ code: err.code, error: err.message }); log.error(err.message, err); + if (req.config && req.config.enableExpressErrorHandler) { + next(err); + } } else if (err.status && err.message) { res.status(err.status); res.json({ error: err.message });