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

  1. Open the original site URL in a browser and confirm whether content actually exists.
  2. If the source has content, the route scraper is likely broken — update selectors/API parsing in the route and report/fix upstream.
  3. If an empty result is legitimate for this route, set `data.allowEmpty = true` before returning.
  4. 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

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


AI-assisted analysis of DIYgod/RSSHub@bed535e087 (2026-08-12). Data as JSON: /api/errors/b29a735ee483b7d2. Report an issue: GitHub.