Skip to content

Commit afcdabb

Browse files
coltonehrmanwesleytodd
authored andcommitted
feat: handle err.cause & err.stack
This is a replacement for #49. I just pulled out the specific change related to this issue and added it here. Closes: expressjs/express#5630 test: Error w/ cause case fix: recursively find Error.cause stacks Remove the error.stack logic as it is redundant test: check for both 1 level & 2 level Error.cause refactor: use native util.format() API for Error printing fix: put back original lines of code test: update tests to be less brittle
1 parent c584cd6 commit afcdabb

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

index.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
* @private
1212
*/
1313

14+
var util = require('util')
1415
var debug = require('debug')('finalhandler')
1516
var encodeUrl = require('encodeurl')
1617
var escapeHtml = require('escape-html')
@@ -172,8 +173,8 @@ function getErrorMessage (err, status, env) {
172173
var msg
173174

174175
if (env !== 'production') {
175-
// use err.stack, which typically includes err.message
176-
msg = err.stack
176+
// use util.format to get native Error print
177+
msg = util.format(err)
177178

178179
// fallback to err.toString() when possible
179180
if (!msg && typeof err.toString === 'function') {

test/test.js

+33
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,39 @@ var topDescribe = function (type, createServer) {
650650
})
651651
})
652652
})
653+
describe('Errors with cause', function () {
654+
it('should return Error message with 1 level cause trace', function (done) {
655+
var err = new Error('foo', { cause: new Error('bar') })
656+
var expectedRegex = [/Error: foo/, /\[cause\]: Error: bar/];
657+
658+
request(createServer(err))
659+
.get('/')
660+
.then((response) => {
661+
for (var i = 0; i < expectedRegex.length; ++i) {
662+
var regex = expectedRegex[i];
663+
assert.match(response.text, regex);
664+
}
665+
done()
666+
})
667+
.catch(done)
668+
})
669+
670+
it('should return Error message with 2 level cause trace', function (done) {
671+
var err = new Error('foo', { cause: new Error('bar', { cause: new Error('baz') }) })
672+
var expectedRegex = [/Error: foo/, /\[cause\]: Error: bar/, /\[cause\]: Error: baz/];
673+
674+
request(createServer(err))
675+
.get('/')
676+
.then((response) => {
677+
for (var i = 0; i < expectedRegex.length; ++i) {
678+
var regex = expectedRegex[i];
679+
assert.match(response.text, regex);
680+
}
681+
done()
682+
})
683+
.catch(done)
684+
})
685+
})
653686
}
654687

655688
var servers = [

0 commit comments

Comments
 (0)