Skip to content

Commit 7143d31

Browse files
committed
update errorHandler templates
1 parent cde85da commit 7143d31

9 files changed

Lines changed: 70 additions & 20 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"async": "^1.5.2",
2121
"cookie-parser": "^1.3.2",
2222
"debug": "^2.2.0",
23-
"errorhandler": "^1.1.1",
23+
"strong-error-handler": "^1.0.1",
2424
"fs-extra": "^0.30.0",
2525
"glob": "^7.0.0",
2626
"lodash": "^4.5.1",

server/config.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
},
2121
"cors": false,
2222
"errorHandler": {
23-
"disableStackTrace": false
23+
"debug": true,
24+
"log": true
2425
}
2526
},
2627
"legacyExplorer": false

server/middleware.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@
1717
"loopback#urlNotFound": {}
1818
},
1919
"final:after": {
20-
"errorhandler": {}
20+
"strong-error-handler": {}
2121
}
2222
}

server/server.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ var path = require('path');
88
var methodOverride = require('method-override');
99
var app = module.exports = loopback();
1010
var boot = require('loopback-boot');
11+
var errorHandler = require('strong-error-handler');
1112

1213
app.set('legacyExplorer', false);
1314

@@ -103,8 +104,7 @@ app.use(loopback.urlNotFound());
103104
*/
104105

105106
// The ultimate error handler.
106-
app.use(loopback.errorHandler());
107-
107+
app.use(errorHandler());
108108
/*
109109
* 5. Add a basic application status route at the root `/`.
110110
*

templates/projects/empty-server/data.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,7 @@ template.server = {
7878
limit: '100kb',
7979
},
8080
cors: false,
81-
errorHandler: {
82-
disableStackTrace: false,
83-
},
81+
handleErrors: false,
8482
}},
8583
{ name: 'legacyExplorer', value: false },
8684
],
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"final:after": {
3+
"strong-error-handler": {
4+
"params": {
5+
"debug": true,
6+
"log": true
7+
}
8+
}
9+
}
10+
}

templates/projects/empty-server/files/server/middleware.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
},
1414
"helmet#xssFilter": {},
1515
"helmet#frameguard": {
16-
"params": [
16+
"params": [
1717
"deny"
1818
]
1919
},
@@ -26,7 +26,7 @@
2626
"helmet#hidePoweredBy": {},
2727
"helmet#ieNoOpen": {},
2828
"helmet#noSniff": {},
29-
"helmet#noCache": {
29+
"helmet#noCache": {
3030
"enabled": false
3131
}
3232
},
@@ -47,6 +47,6 @@
4747
"loopback#urlNotFound": {}
4848
},
4949
"final:after": {
50-
"loopback#errorHandler": {}
50+
"strong-error-handler": {}
5151
}
5252
}

templates/projects/empty-server/files/server/middleware.production.json

Lines changed: 0 additions & 9 deletions
This file was deleted.

test/end-to-end.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ var TestDataBuilder = require('./helpers/test-data-builder');
1919
var ref = TestDataBuilder.ref;
2020
var given = require('./helpers/given');
2121
var should = require('chai').should();
22+
// This may not work when the scaffolded application uses a different
23+
// loopback or loopback-boot version than the one used in loopback-workspace
24+
// Please make sure that versions are conform.
25+
var loopback = require('loopback');
26+
var boot = require('loopback-boot');
2227

2328
var Workspace = workspace.models.Workspace;
2429

@@ -983,6 +988,51 @@ describe('end-to-end', function() {
983988
});
984989
});
985990

991+
it('includes sensitive error details in development mode', function(done) {
992+
var app = loopback({ localRegistry: true, loadBuiltinModels: true });
993+
var bootOptions = {
994+
appRootDir: SANDBOX + '/server',
995+
env: 'development'
996+
};
997+
boot(app, bootOptions, function(err) {
998+
request(app)
999+
.get('/url-does-not-exist')
1000+
.expect(404)
1001+
.end(function(err, res) {
1002+
if (err) return done (err);
1003+
var responseBody = JSON.stringify(res.body);
1004+
expect(responseBody).to.include('stack');
1005+
1006+
done();
1007+
});
1008+
});
1009+
});
1010+
1011+
it('omits sensitive error details in production mode', function(done) {
1012+
var app = loopback({ localRegistry: true, loadBuiltinModels: true });
1013+
var bootOptions = {
1014+
appRootDir: SANDBOX + '/server',
1015+
env: 'production'
1016+
};
1017+
boot(app, bootOptions, function(err) {
1018+
request(app)
1019+
.get('/url-does-not-exist')
1020+
.expect(404)
1021+
.end(function(err, res) {
1022+
// Assert that the response body does not contain stack trace.
1023+
// We want the assertion to be robust and keep working even
1024+
// if the property name storing stack trace changes in the future,
1025+
// therefore we test full response body.
1026+
if (err) return done(err);
1027+
var responseBody = JSON.stringify(res.body);
1028+
expect(responseBody).to.not.have.property('stack');
1029+
expect(responseBody).to.not.include('stack');
1030+
expect(JSON.stringify(res.body, null, 2)).to.not.contain(__filename);
1031+
done();
1032+
});
1033+
});
1034+
});
1035+
9861036
function setupConnection(done) {
9871037
var connection = mysql.createConnection({
9881038
database: MYSQL_DATABASE,

0 commit comments

Comments
 (0)