dont serve error page for unhandled server route errors - fixes #138

This commit is contained in:
Rich Harris
2018-02-28 16:54:38 -05:00
parent 5ad3f3f1d5
commit b1d072d43a
3 changed files with 28 additions and 5 deletions

View File

@@ -115,7 +115,7 @@ function get_asset_handler({ pathname, type, cache, body }: {
const resolved = Promise.resolve();
function get_route_handler(chunks: Record<string, string>, routes: RouteObject[], template: Template) {
function handle_route(route: RouteObject, req: Req, res: ServerResponse) {
function handle_route(route: RouteObject, req: Req, res: ServerResponse, next: () => void) {
req.params = route.params(route.pattern.exec(req.pathname));
const mod = route.module;
@@ -234,9 +234,21 @@ function get_route_handler(chunks: Record<string, string>, routes: RouteObject[]
};
}
handler(req, res, () => {
handle_not_found(req, res, 404, 'Not found');
});
const handle_error = err => {
if (err) {
console.error(err.stack);
res.statusCode = 500;
res.end(err.message);
} else {
handle_not_found(req, res, 404, 'Not found');
}
};
try {
handler(req, res, handle_error);
} catch (err) {
handle_error(err);
}
} else {
// no matching handler for method — 404
handle_not_found(req, res, 404, 'Not found');
@@ -299,7 +311,7 @@ function get_route_handler(chunks: Record<string, string>, routes: RouteObject[]
try {
for (const route of routes) {
if (!route.error && route.pattern.test(url)) return handle_route(route, req, res);
if (!route.error && route.pattern.test(url)) return handle_route(route, req, res, next);
}
handle_not_found(req, res, 404, 'Not found');

View File

@@ -0,0 +1,3 @@
export function get() {
throw new Error('nope');
}

View File

@@ -391,6 +391,14 @@ function run(env) {
JSON.parse(text);
});
});
it('does not serve error page for non-page errors', () => {
return nightmare.goto(`${base}/throw-an-error`)
.page.text()
.then(text => {
assert.equal(text, 'nope');
});
});
});
describe('headers', () => {