diff --git a/lib/middleware/onerror.js b/lib/middleware/onerror.js
index 04c9c4c9f..a29f59b7a 100644
--- a/lib/middleware/onerror.js
+++ b/lib/middleware/onerror.js
@@ -39,6 +39,10 @@ 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;
+
let message = err;
if (err.name && (err.name === 'HTTPError' || err.name === 'RequestError')) {
message = `${err.message}: target website might be blocking our access, you can host your own RSSHub instance for a better usability.`;
diff --git a/test/middleware/onerror.js b/test/middleware/onerror.js
index 562ebed16..f2ca60048 100644
--- a/test/middleware/onerror.js
+++ b/test/middleware/onerror.js
@@ -6,6 +6,7 @@ jest.mock('request-promise-native');
const server = require('../../lib/index');
const config = require('../../lib/config').value;
const request = supertest(server);
+const cheerio = require('cheerio');
afterAll(() => {
server.close();
@@ -42,3 +43,34 @@ describe('RequestInProgressError', () => {
expect(responses.filter((r) => r.text.includes('This path is currently fetching, please come back later!'))).toHaveLength(1);
});
});
+
+describe('v2 route throws an error', () => {
+ it('v2 route path error should have path mounted', async () => {
+ await request.get('/test/error');
+ await request.get('/thisDoesNotExist');
+ const response = await request.get('/');
+
+ const $ = cheerio.load(response.text);
+ $('.debug-item').each((index, item) => {
+ const key = $(item).find('.debug-key').text().trim();
+ const value = $(item).find('.debug-value').html().trim();
+ switch (key) {
+ case 'Request Amount:':
+ expect(value).toBe('7');
+ break;
+ case 'Hot Routes:':
+ expect(value).toBe('4 /test/:id
1 /test/slow
1 /thisDoesNotExist
');
+ 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
');
+ break;
+ case 'Hot Error Paths:':
+ expect(value).toBe('2 /test/error
1 /test/httperror
1 /test/slow
1 /thisDoesNotExist
');
+ break;
+ }
+ });
+ });
+});