Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
sudo: false
language: node_js
node_js:
- "4"
- "6"
- "7"
- "8"
- "10"
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ In production mode, `strong-error-handler` omits details from error responses to

In debug mode, `strong-error-handler` returns full error stack traces and internal details of any error objects to the client in the HTTP responses.

## Supported versions

Current|Long Term Support|Maintenance
:-:|:-:|:-:
3.x|2.x|1.x

Learn more about our LTS plan in [docs](http://loopback.io/doc/en/contrib/Long-term-support.html).

## Installation

```bash
Expand Down
2 changes: 1 addition & 1 deletion lib/content-negotiation.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ function negotiateContentProducer(req, logWarning, options) {
} else {
debug('contentType: `%s` is not supported, ' +
'falling back to contentType: `%s`',
options.defaultType, contentType);
options.defaultType, contentType);
}
}

Expand Down
22 changes: 11 additions & 11 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"license": "MIT",
"version": "2.3.2",
"engines": {
"node": ">=4"
"node": ">=6"
},
"repository": {
"type": "git",
Expand All @@ -18,19 +18,19 @@
},
"dependencies": {
"accepts": "^1.3.3",
"debug": "^2.2.0",
"ejs": "^2.5.7",
"http-status": "^1.0.0",
"debug": "^3.1.0",
"ejs": "^2.6.1",
"http-status": "^1.1.2",
"js2xmlparser": "^3.0.0",
"strong-globalize": "^3.1.0"
"strong-globalize": "^4.1.0"
},
"devDependencies": {
"chai": "^3.5.0",
"eslint": "^3.14.1",
"eslint-config-loopback": "^8.0.0",
"express": "^4.13.4",
"mocha": "^3.2.0",
"supertest": "^3.0.0"
"chai": "^4.1.2",
"eslint": "^4.19.1",
"eslint-config-loopback": "^10.0.0",
"express": "^4.16.3",
"mocha": "^5.2.0",
"supertest": "^3.1.0"
},
"browser": {
"strong-error-handler": false
Expand Down
85 changes: 45 additions & 40 deletions test/handler.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ var util = require('util');
describe('strong-error-handler', function() {
before(setupHttpServerAndClient);
beforeEach(resetRequestHandler);
after(stopHttpServerAndClient);

it('sets nosniff header', function(done) {
givenErrorHandlerForError();
Expand Down Expand Up @@ -218,50 +219,50 @@ describe('strong-error-handler', function() {
});

it('includes code property for 4xx status codes when debug=false',
function(done) {
var error = new ErrorWithProps({
statusCode: 400,
message: 'error with code',
name: 'ErrorWithCode',
code: 'MACHINE_READABLE_CODE',
});
givenErrorHandlerForError(error, {debug: false});

requestJson().end(function(err, res) {
if (err) return done(err);

var expectedData = {
function(done) {
var error = new ErrorWithProps({
statusCode: 400,
message: 'error with code',
name: 'ErrorWithCode',
code: 'MACHINE_READABLE_CODE',
};
expect(res.body).to.have.property('error');
expect(res.body.error).to.eql(expectedData);
done();
});
givenErrorHandlerForError(error, {debug: false});

requestJson().end(function(err, res) {
if (err) return done(err);

var expectedData = {
statusCode: 400,
message: 'error with code',
name: 'ErrorWithCode',
code: 'MACHINE_READABLE_CODE',
};
expect(res.body).to.have.property('error');
expect(res.body.error).to.eql(expectedData);
done();
});
});
});

it('excludes code property for 5xx status codes when debug=false',
function(done) {
var error = new ErrorWithProps({
statusCode: 500,
code: 'MACHINE_READABLE_CODE',
});
givenErrorHandlerForError(error, {debug: false});
function(done) {
var error = new ErrorWithProps({
statusCode: 500,
code: 'MACHINE_READABLE_CODE',
});
givenErrorHandlerForError(error, {debug: false});

requestJson().end(function(err, res) {
if (err) return done(err);
requestJson().end(function(err, res) {
if (err) return done(err);

var expectedData = {
statusCode: 500,
message: 'Internal Server Error',
};
expect(res.body).to.have.property('error');
expect(res.body.error).to.eql(expectedData);
done();
var expectedData = {
statusCode: 500,
message: 'Internal Server Error',
};
expect(res.body).to.have.property('error');
expect(res.body.error).to.eql(expectedData);
done();
});
});
});

it('contains non-enumerable Error properties when debug=true',
function(done) {
Expand Down Expand Up @@ -786,7 +787,7 @@ describe('strong-error-handler', function() {
});
});

var app, _requestHandler, request;
var app, _requestHandler, request, server;
function resetRequestHandler() {
_requestHandler = null;
}
Expand Down Expand Up @@ -834,16 +835,20 @@ function setupHttpServerAndClient(done) {
}
});

app.listen(0, function() {
server = app.listen(0, function() {
var url = 'http://127.0.0.1:' + this.address().port;
debug('Test server listening on %s', url);
request = supertest(app);
done();
})
.once('error', function(err) {
debug('Cannot setup HTTP server: %s', err.stack);
done(err);
});
.once('error', function(err) {
debug('Cannot setup HTTP server: %s', err.stack);
done(err);
});
}

function stopHttpServerAndClient() {
server.close();
}

function ErrorWithProps(props) {
Expand Down