Skip to content

Commit

Permalink
fix: capture async stack only for rejections with native error object…
Browse files Browse the repository at this point in the history
…s; (#6203)
  • Loading branch information
DigitalBrainJS committed Jan 25, 2024
1 parent 104aa3f commit 1a08f90
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 26 deletions.
25 changes: 14 additions & 11 deletions lib/core/Axios.js
Expand Up @@ -39,17 +39,20 @@ class Axios {
try {
return await this._request(configOrUrl, config);
} catch (err) {
const dummy = {}
if (Error.captureStackTrace) {
Error.captureStackTrace(dummy)
} else {
dummy.stack = new Error().stack;
}
// slice off the Error: ... line
dummy.stack = dummy.stack.replace(/^.+\n/, '');
// match without the 2 top stack lines
if (!err.stack.endsWith(dummy.stack.replace(/^.+\n.+\n/, ''))) {
err.stack += '\n' + dummy.stack
if (err instanceof Error) {
let dummy;

Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : (dummy = new Error());

// slice off the Error: ... line
const stack = dummy.stack ? dummy.stack.replace(/^.+\n/, '') : '';

if (!err.stack) {
err.stack = stack;
// match without the 2 top stack lines
} else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\n.+\n/, ''))) {
err.stack += '\n' + stack
}
}

throw err;
Expand Down
31 changes: 16 additions & 15 deletions test/unit/adapters/http.js
Expand Up @@ -449,28 +449,29 @@ describe('supports http with nodejs', function () {
});
});

it('should wrap HTTP errors and keep stack', function (done) {
it('should wrap HTTP errors and keep stack', async function () {
if (nodeMajorVersion <= 12) {
this.skip(); // node 12 support for async stack traces appears lacking
return;
}
server = http.createServer(function (req, res) {

server = await startHTTPServer((req, res) => {
res.statusCode = 400;
res.end();
}).listen(4444, function () {
void assert.rejects(
async function findMeInStackTrace() {
await axios.head('http://localhost:4444/one')
},
function (err) {
assert.equal(err.name, 'AxiosError')
assert.equal(err.isAxiosError, true)
const matches = [...err.stack.matchAll(/findMeInStackTrace/g)]
assert.equal(matches.length, 1, err.stack)
return true;
}
).then(done).catch(done);
});

return assert.rejects(
async function findMeInStackTrace() {
await axios.head('http://localhost:4444/one')
},
function (err) {
assert.equal(err.name, 'AxiosError')
assert.equal(err.isAxiosError, true)
const matches = [...err.stack.matchAll(/findMeInStackTrace/g)]
assert.equal(matches.length, 1, err.stack)
return true;
}
)
});

it('should wrap interceptor errors and keep stack', function (done) {
Expand Down

0 comments on commit 1a08f90

Please sign in to comment.