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); }); });