mirror of
https://github.com/tenrok/axios.git
synced 2026-06-20 20:00:40 +03:00
fix: capture async stack only for rejections with native error objects; (#6203)
This commit is contained in:
+14
-11
@@ -39,17 +39,20 @@ class Axios {
|
|||||||
try {
|
try {
|
||||||
return await this._request(configOrUrl, config);
|
return await this._request(configOrUrl, config);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
const dummy = {}
|
if (err instanceof Error) {
|
||||||
if (Error.captureStackTrace) {
|
let dummy;
|
||||||
Error.captureStackTrace(dummy)
|
|
||||||
} else {
|
Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : (dummy = new Error());
|
||||||
dummy.stack = new Error().stack;
|
|
||||||
}
|
// slice off the Error: ... line
|
||||||
// slice off the Error: ... line
|
const stack = dummy.stack ? dummy.stack.replace(/^.+\n/, '') : '';
|
||||||
dummy.stack = dummy.stack.replace(/^.+\n/, '');
|
|
||||||
// match without the 2 top stack lines
|
if (!err.stack) {
|
||||||
if (!err.stack.endsWith(dummy.stack.replace(/^.+\n.+\n/, ''))) {
|
err.stack = stack;
|
||||||
err.stack += '\n' + dummy.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;
|
throw err;
|
||||||
|
|||||||
+16
-15
@@ -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) {
|
if (nodeMajorVersion <= 12) {
|
||||||
this.skip(); // node 12 support for async stack traces appears lacking
|
this.skip(); // node 12 support for async stack traces appears lacking
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
server = http.createServer(function (req, res) {
|
|
||||||
|
server = await startHTTPServer((req, res) => {
|
||||||
res.statusCode = 400;
|
res.statusCode = 400;
|
||||||
res.end();
|
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) {
|
it('should wrap interceptor errors and keep stack', function (done) {
|
||||||
|
|||||||
Reference in New Issue
Block a user