DIYgod/RSSHub · error
this route is empty, please check the original site or <a hr
Error message
this route is empty, please check the original site or <a href="https://github.com/DIYgod/RSSHub/issues/new/choose">create an issue</a>
What it means
Thrown by the parameter middleware after the route handler runs, when the assembled Data has no items (item is falsy or length 0) and the route did not opt in via data.allowEmpty. It is RSSHub's signal that a route is broken or the source genuinely has nothing, rather than silently serving an empty feed.
Source
Thrown at lib/middleware/parameter.ts:72
return response.choices[0].message.content;
};
const getAuthorString = (item) => {
let author = '';
if (item.author) {
author = typeof item.author === 'string' ? item.author : item.author.map((i) => i.name).join(' ');
}
return author;
};
const middleware: MiddlewareHandler = async (ctx, next) => {
await next();
const data = ctx.get('data') as Data;
if (data) {
if ((!data.item || data.item.length === 0) && !data.allowEmpty) {
throw new Error('this route is empty, please check the original site or <a href="https://github.com/DIYgod/RSSHub/issues/new/choose">create an issue</a>');
}
// fix allowEmpty
data.item ||= [];
// decode HTML entities
data.title &&= entities.decodeXML(data.title + '');
data.description &&= entities.decodeXML(data.description + '');
// sort items
if (ctx.req.query('sorted') !== 'false') {
data.item = data.item.toSorted((a: DataItem, b: DataItem) => +new Date(b.pubDate || 0) - +new Date(a.pubDate || 0));
}
const handleItem = (item: DataItem) => {
item.title &&= entities.decodeXML(item.title + '');
item.description ||= item.content?.html;
View on GitHub (pinned to bed535e087)
Solutions
- Open the original site URL in a browser and confirm whether content actually exists.
- If the source has content, the route scraper is likely broken — update selectors/API parsing in the route and report/fix upstream.
- If an empty result is legitimate for this route, set `data.allowEmpty = true` before returning.
- Check the route's required parameters are supplied correctly.
Example fix
// before — route returns empty and feed 500s
return { item: [] };
// after — opt in to an intentionally empty feed
return { item: [], allowEmpty: true }; Defensive patterns
Strategy: fallback
Validate before calling
// Route author: validate scraped items before returning.
if (items.length === 0 && !legitimatelyEmpty) {
// selectors probably broke — log and surface a clearer error
logger.error('No items parsed; check selectors for %s', currentUrl);
} Type guard
const isEmptyByDesign = (data: Data): boolean => Array.isArray(data.item) && data.item.length === 0 && data.allowEmpty === true;
Try / catch
// Reader/client: an 'empty route' 500 means the source is broken, not transient. // Do not retry aggressively; back off and alert the operator.
Prevention
- Set data.allowEmpty only when emptiness is expected (e.g. search with no results).
- Pin selectors to stable containers and add tests against saved HTML.
- Log the upstream URL/status when items are empty to speed diagnosis.
When it happens
Trigger: The route's scraper returned [] because selectors no longer match the redesigned source site; the upstream API returned an empty list; a required query parameter was omitted so the source returns nothing; a transient empty response that is not retried.
Common situations: Source site ships a redesign and selectors break; upstream API changes shape; geographic/IP block returns an empty page; a previously-working feed suddenly 500s after a site change.
Related errors
- Unknown type: ${item.type}
- Comic Not Found - ${name}
- Authentication failed. Access denied.\n${requestPath}
- Invalid URL property: ${prop}
- Invalid Engine Value: ${engine}, please check your config.
AI-assisted analysis of DIYgod/RSSHub@bed535e087 (2026-08-12).
Data as JSON: /api/errors/b29a735ee483b7d2.
Report an issue: GitHub.