diff --git a/lib/middleware/onerror.js b/lib/middleware/onerror.js
index a29f59b7a74433..3a966029521906 100644
--- a/lib/middleware/onerror.js
+++ b/lib/middleware/onerror.js
@@ -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')) {
diff --git a/test/middleware/onerror.js b/test/middleware/onerror.js
index f2ca6004807d40..e92fcea13a31bb 100644
--- a/test/middleware/onerror.js
+++ b/test/middleware/onerror.js
@@ -59,13 +59,13 @@ describe('v2 route throws an error', () => {
expect(value).toBe('7');
break;
case 'Hot Routes:':
- expect(value).toBe('4 /test/:id
1 /test/slow
1 /thisDoesNotExist
');
+ expect(value).toBe('4 /test/:id
');
break;
case 'Hot Paths:':
expect(value).toBe('2 /test/error
2 /test/slow
1 /test/httperror
1 /thisDoesNotExist
1 /
');
break;
case 'Hot Error Routes:':
- expect(value).toBe('3 /test/:id
1 /test/slow
1 /thisDoesNotExist
');
+ expect(value).toBe('3 /test/:id
');
break;
case 'Hot Error Paths:':
expect(value).toBe('2 /test/error
1 /test/httperror
1 /test/slow
1 /thisDoesNotExist
');
diff --git a/test/utils/rand-user-agent.js b/test/utils/rand-user-agent.js
index 01b2cc5b90be40..d8a44301f821a6 100644
--- a/test/utils/rand-user-agent.js
+++ b/test/utils/rand-user-agent.js
@@ -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);
});
});