Skip to content

Commit

Permalink
Forward errors along to error handling middlewares
Browse files Browse the repository at this point in the history
  • Loading branch information
Arjan Singh committed Aug 24, 2016
1 parent 3be164a commit 052ef84
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 4 deletions.
12 changes: 10 additions & 2 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,24 @@ function fastbootExpressMiddleware(distPath, options) {
result.html()
.then(html => {
let headers = result.headers;
let statusMessage = result.error ? 'NOT OK ' : 'OK ';

for (var pair of headers.entries()) {
res.set(pair[0], pair[1]);
}

log(result.statusCode, 'OK ' + path);
if (result.error) {
log("RESILIENT MODE CAUGHT:", result.error.stack);
next(result.error);
}

log(result.statusCode, statusMessage + path);
res.status(result.statusCode);
res.send(html);
})
.catch(error => {
console.log(error.stack);
log(500, error.stack);
next(error);
res.sendStatus(500);
});
}
Expand All @@ -55,6 +62,7 @@ function fastbootExpressMiddleware(distPath, options) {
if (error.name === "UnrecognizedURLError") {
next();
} else {
next(error);
log(500, "Unknown Error: " + error.stack);
if (error.stack) {
res.status(500).send(error.stack);
Expand Down
15 changes: 14 additions & 1 deletion test/helpers/test-http-server.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ class TestHTTPServer {

app.get('/*', this.middleware);

app.use((err, req, res, next) => {
res.set('x-test-error', 'error handler called');
next();
});

return new Promise((resolve, reject) => {
let port = options.port || 3000;
let host = options.host || 'localhost';
Expand All @@ -42,9 +47,17 @@ class TestHTTPServer {
});
}

request(urlPath) {
request(urlPath, options) {
let info = this.info;
let url = 'http://[' + info.host + ']:' + info.port;

if (options && options.resolveWithFullResponse) {
return request({
resolveWithFullResponse: options.resolveWithFullResponse,
uri: url + urlPath
});
}

return request(url + urlPath);
}

Expand Down
30 changes: 29 additions & 1 deletion test/middleware-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ describe("FastBoot", function() {
});
});

it("renders an empty page if the resilient flag is set", function() {
it("renders no FastBoot markup if the resilient flag is set", function() {
let middleware = fastbootMiddleware({
distPath: fixture('rejected-promise'),
resilient: true
Expand All @@ -79,6 +79,34 @@ describe("FastBoot", function() {
});
});

it("propagates to error handling middleware if the resilient flag is set", function() {
let middleware = fastbootMiddleware({
distPath: fixture('rejected-promise'),
resilient: true
});
server = new TestHTTPServer(middleware);

return server.start()
.then(() => server.request('/', { resolveWithFullResponse: true }))
.then(res => {
expect(res.headers['x-test-error']).to.match(/error handler called/);
});
});

it("propagates to error handling middleware if the resilient flag is not set", function() {
let middleware = fastbootMiddleware({
distPath: fixture('rejected-promise'),
resilient: false,
});
server = new TestHTTPServer(middleware);

return server.start()
.then(() => server.request('/', { resolveWithFullResponse: true }))
.catch(({statusCode, response: { headers} }) => {
expect(headers['x-test-error']).to.match(/error handler called/);
});
});

it("can be provided with a custom FastBoot instance", function() {
let fastboot = new FastBoot({
distPath: fixture('basic-app')
Expand Down

0 comments on commit 052ef84

Please sign in to comment.