Skip to content

Commit b0aa4dc

Browse files
committed
improve stack trace of errors
1 parent 50093cc commit b0aa4dc

1 file changed

Lines changed: 45 additions & 1 deletion

File tree

lib/client.js

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ class Client {
4747
const responseStream = request.post(optionsToUse)
4848

4949
responseStream.on('error', (err) => {
50+
const error = new Error('Error while executing request to remote server')
51+
52+
addStack(error, err.stack, {
53+
stackPrefix: 'Request Error stack:'
54+
})
55+
56+
error.message = `${error.message}. ${err.message}`
57+
5058
reject(err)
5159
})
5260

@@ -60,10 +68,21 @@ class Client {
6068
try {
6169
const errorMessage = JSON.parse(data.toString())
6270
const error = new Error(errorMessage.message)
71+
72+
addStack(error, errorMessage.stack, {
73+
stripMessage: true,
74+
stackPrefix: 'Remote stack: '
75+
})
76+
6377
error.remoteStack = errorMessage.stack
6478
reject(error)
6579
} catch (e) {
66-
const err = new Error('Unknown error, status code ' + response.statusCode)
80+
const err = new Error(`Error while executing request to remote server: Unknown error, status code ${response.statusCode}`)
81+
82+
addStack(err, e.stack, {
83+
stackPrefix: 'Parsing Error stack:'
84+
})
85+
6786
err.response = response
6887
reject(err)
6988
}
@@ -117,3 +136,28 @@ function extractDataFromResponse (response, cb) {
117136
response.on('error', (err) => cb(err))
118137
response.pipe(writeStream)
119138
}
139+
140+
function addStack (err, stack, { stackPrefix = '', stripMessage = false } = {}) {
141+
if (stack != null && stack !== '') {
142+
let newStack = stack
143+
let originalStack = ''
144+
145+
if (err.stack != null && err.stack !== '') {
146+
originalStack = `${err.stack}\n`
147+
}
148+
149+
if (stripMessage) {
150+
// to avoid duplicating message we strip the message
151+
// from the stack if it is equals to the message of error
152+
newStack = newStack.replace(/(\S+:) (.+)(\r?\n)/, (match, gLabel, gMessage, gRest) => {
153+
if (err.message === gMessage) {
154+
return `${gLabel}${gRest}`
155+
}
156+
157+
return match
158+
})
159+
}
160+
161+
err.stack = `${originalStack}${stackPrefix}${newStack}`
162+
}
163+
}

0 commit comments

Comments
 (0)