diff --git a/operations/development-server.js b/operations/development-server.js index 38a0bcf..30dff60 100644 --- a/operations/development-server.js +++ b/operations/development-server.js @@ -57,7 +57,7 @@ function monkeyPatchEnd(res) { }; } -function createExpressMiddleware(app) { +function createExpressMiddleware(app, fullBundlePath) { return function expressMiddleware(req, res, next) { try { monkeyPatchEnd(res); @@ -67,28 +67,37 @@ function createExpressMiddleware(app) { }); } - app.handle(req, res, (err) => { - if (err != null && err instanceof Error) { - res - .status(500) - .send(`${reloadClientTag}
${entities.escape(err.stack)}
`); - } else { - next(err); - } - }); + // Ensure that we never intercept budo-served resources. Otherwise, the Express app might have something like a 404 handler or "always require login" middleware that stops requests for budo assets from ever coming out the other end of the Express app. + if (req.url !== "/budo/livereload.js" && req.url !== `/${fullBundlePath}`) { + app.handle(req, res, (err) => { + if (err != null && err instanceof Error) { + res + .status(500) + .send(`${reloadClientTag}
${entities.escape(err.stack)}
`); + } else { + next(err); + } + }); + } else { + next(); + } }; } module.exports = function ({ options, staticPath, staticBasePath, entryPaths, host }) { let middlewareList; + let fullBundlePath = (options.staticPrefix != null) + ? path.join(options.staticPrefix, options.bundlePath) + : options.bundlePath; + if (options.middleware != null) { middlewareList = assureArray(options.middleware).concat([ - createExpressMiddleware(options.expressApp) + createExpressMiddleware(options.expressApp, fullBundlePath) ]); } else { middlewareList = [ - createExpressMiddleware(options.expressApp) + createExpressMiddleware(options.expressApp, fullBundlePath) ]; } @@ -100,9 +109,7 @@ module.exports = function ({ options, staticPath, staticBasePath, entryPaths, ho port: options.port, host: host, dir: staticBasePath, - serve: (options.staticPrefix != null) - ? path.join(options.staticPrefix, options.bundlePath) - : options.bundlePath, + serve: fullBundlePath, browserify: options.browserify, middleware: middlewareList, debug: defaultValue(options.sourceMaps, true),