fix(core): duplicated path if the error is thrown from parameter (#13967)

* fix(core): double namespace if the error is thrown from parameter

* test: fix test case
This commit is contained in:
Tony 2023-12-06 00:00:00 +00:00 committed by GitHub
parent 88241f5cd1
commit 7da162041f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 10 deletions

View File

@ -39,9 +39,13 @@ module.exports = async (ctx, next) => {
});
}
} catch (err) {
// Append v2 route path
ctx.request.path = (ctx.mountPath ?? '') + ctx.request.path;
ctx._matchedRoute = ctx._matchedRoute ? (ctx.mountPath ?? '') + ctx._matchedRoute : ctx.request.path;
if (err instanceof Error && !err.stack.split('\n')[1].includes('lib/middleware/parameter.js')) {
// Append v2 route path if a route throws an error
// since koa-mount will remove the mount path from ctx.request.path
// https://github.com/koajs/mount/issues/62
ctx.request.path = (ctx.mountPath ?? '') + ctx.request.path;
ctx._matchedRoute = ctx._matchedRoute ? (ctx.mountPath ?? '') + ctx._matchedRoute : ctx._matchedRoute;
}
let message = err;
if (err.name && (err.name === 'HTTPError' || err.name === 'RequestError')) {

View File

@ -59,13 +59,13 @@ describe('v2 route throws an error', () => {
expect(value).toBe('7');
break;
case 'Hot Routes:':
expect(value).toBe('4 /test/:id<br>1 /test/slow<br>1 /thisDoesNotExist<br>');
expect(value).toBe('4 /test/:id<br>');
break;
case 'Hot Paths:':
expect(value).toBe('2 /test/error<br>2 /test/slow<br>1 /test/httperror<br>1 /thisDoesNotExist<br>1 /<br>');
break;
case 'Hot Error Routes:':
expect(value).toBe('3 /test/:id<br>1 /test/slow<br>1 /thisDoesNotExist<br>');
expect(value).toBe('3 /test/:id<br>');
break;
case 'Hot Error Paths:':
expect(value).toBe('2 /test/error<br>1 /test/httperror<br>1 /test/slow<br>1 /thisDoesNotExist<br>');

View File

@ -33,15 +33,17 @@ describe('rand-user-agent', () => {
});
it('should match ua configurated', async () => {
const response1 = await got('https://httpbingo.org/user-agent');
expect(response1.data['user-agent']).toBe(config.ua);
nock('https://rsshub.test')
.get('/test')
.reply(function () {
return [200, { ua: this.req.headers['user-agent'] }];
});
const response2 = await got('https://httpbingo.org/user-agent', {
const resonse = await got('https://rsshub.test/test', {
headers: {
'user-agent': mobileUa,
},
});
expect(response2.data['user-agent']).toBe(mobileUa);
expect(response2.data['user-agent']).not.toBe(config.ua);
expect(resonse.data.ua).toBe(mobileUa);
});
});