diff --git a/src/ParseServer.js b/src/ParseServer.js index 60eb8d6398..b1e30df328 100644 --- a/src/ParseServer.js +++ b/src/ParseServer.js @@ -284,11 +284,11 @@ class ParseServer { var api = express(); //api.use("/apps", express.static(__dirname + "/public")); // File handling needs to be before default middlewares are applied - api.use('/', middlewares.allowCrossDomain, new FilesRouter().getExpressRouter({ + api.use('/', middlewares.allowCrossDomain, new FilesRouter().expressRouter({ maxUploadSize: maxUploadSize })); - api.use('/', bodyParser.urlencoded({extended: false}), new PublicAPIRouter().expressApp()); + api.use('/', bodyParser.urlencoded({extended: false}), new PublicAPIRouter().expressRouter()); // TODO: separate this from the regular ParseServer object if (process.env.TESTING == 1) { @@ -296,9 +296,7 @@ class ParseServer { } api.use(bodyParser.json({ 'type': '*/*' , limit: maxUploadSize })); - api.use(middlewares.allowCrossDomain); api.use(middlewares.allowMethodOverride); - api.use(middlewares.handleParseHeaders); let routers = [ new ClassesRouter(), @@ -323,10 +321,12 @@ class ParseServer { }, []); let appRouter = new PromiseRouter(routes, appId); - + appRouter.use(middlewares.allowCrossDomain); + appRouter.use(middlewares.handleParseHeaders); + batch.mountOnto(appRouter); - api.use(appRouter.expressApp()); + api.use(appRouter.expressRouter()); api.use(middlewares.handleParseErrors); diff --git a/src/PromiseRouter.js b/src/PromiseRouter.js index 1252b22747..2886aa06fd 100644 --- a/src/PromiseRouter.js +++ b/src/PromiseRouter.js @@ -23,6 +23,7 @@ export default class PromiseRouter { // location: optional. a location header constructor(routes = [], appId) { this.routes = routes; + this.middlewares = []; this.appId = appId; this.mountRoutes(); } @@ -38,6 +39,10 @@ export default class PromiseRouter { } }; + use(middleware) { + this.middlewares.push(middleware); + } + route(method, path, ...handlers) { switch(method) { case 'POST': @@ -107,47 +112,17 @@ export default class PromiseRouter { // Mount the routes on this router onto an express app (or express router) mountOnto(expressApp) { - for (var route of this.routes) { - switch(route.method) { - case 'POST': - expressApp.post(route.path, makeExpressHandler(this.appId, route.handler)); - break; - case 'GET': - expressApp.get(route.path, makeExpressHandler(this.appId, route.handler)); - break; - case 'PUT': - expressApp.put(route.path, makeExpressHandler(this.appId, route.handler)); - break; - case 'DELETE': - expressApp.delete(route.path, makeExpressHandler(this.appId, route.handler)); - break; - default: - throw 'unexpected code branch'; - } - } + this.routes.forEach((route) => { + let method = route.method.toLowerCase(); + let handler = makeExpressHandler(this.appId, route.handler); + let args = [].concat(route.path, this.middlewares, handler); + expressApp[method].apply(expressApp, args); + }); + return expressApp; }; - expressApp() { - var expressApp = express(); - for (var route of this.routes) { - switch(route.method) { - case 'POST': - expressApp.post(route.path, makeExpressHandler(this.appId, route.handler)); - break; - case 'GET': - expressApp.get(route.path, makeExpressHandler(this.appId, route.handler)); - break; - case 'PUT': - expressApp.put(route.path, makeExpressHandler(this.appId, route.handler)); - break; - case 'DELETE': - expressApp.delete(route.path, makeExpressHandler(this.appId, route.handler)); - break; - default: - throw 'unexpected code branch'; - } - } - return expressApp; + expressRouter() { + return this.mountOnto(express.Router()); } } diff --git a/src/Routers/FilesRouter.js b/src/Routers/FilesRouter.js index 7afa923f00..ef0375f559 100644 --- a/src/Routers/FilesRouter.js +++ b/src/Routers/FilesRouter.js @@ -7,7 +7,7 @@ import mime from 'mime'; export class FilesRouter { - getExpressRouter(options = {}) { + expressRouter(options = {}) { var router = express.Router(); router.get('/files/:appId/:filename', this.getHandler); diff --git a/src/Routers/PublicAPIRouter.js b/src/Routers/PublicAPIRouter.js index c5d94e7862..31e110351b 100644 --- a/src/Routers/PublicAPIRouter.js +++ b/src/Routers/PublicAPIRouter.js @@ -152,10 +152,10 @@ export class PublicAPIRouter extends PromiseRouter { req => { return this.requestResetPassword(req); }); } - expressApp() { - let router = express(); + expressRouter() { + let router = express.Router(); router.use("/apps", express.static(public_html)); - router.use("/", super.expressApp()); + router.use("/", super.expressRouter()); return router; } }