DIYgod/RSSHub · error · Error

Unhandled attribute

Error message

Unhandled attribute: ${attribute}

What it means

bbc/utils.tsx wraps text in <strong>/<em> based on an attribute list. Any attribute other than 'bold' or 'italic' falls through to default and throws, so a new BBC visual attribute (e.g. underline, strikethrough) surfaces immediately instead of being silently dropped.

Solutions

  1. Inspect the failing block in the BBC API response to see the new attribute string.
  2. Add a case for the new attribute (e.g. 'underline' -> <u>, 'strikethrough' -> <s>) in the switch at lib/routes/bbc/utils.tsx:54.
  3. If unsure how to render it, add a case returning the unmodified result instead of throwing.

Example fix

// before
case 'italic': result = <em>{result}</em>; break;
default: throw new Error(`Unhandled attribute: ${attribute}`);
// after
case 'italic': result = <em>{result}</em>; break;
case 'underline': result = <u>{result}</u>; break;
default: return result;
Defensive patterns

Strategy: fallback

Validate before calling

const KNOWN_ATTRIBUTES = new Set(['bold', 'italic']);
function allAttributesKnown(attrs: string[] = []): boolean {
  return attrs.every((a) => KNOWN_ATTRIBUTES.has(a));
}

Type guard

const isKnownAttribute = (a: unknown): boolean =>
  a === 'bold' || a === 'italic';

Try / catch

try {
  return wrapWithAttributes(result, attributes);
} catch (e) {
  if (e instanceof Error && /Unhandled attribute/.test(e.message)) {
    logger.warn(e.message);
    return result; // ignore unknown attribute, keep text
  }
  throw e;
}

Prevention

When it happens

Trigger: The BBC content API returns an attribute string that is not 'bold' or 'italic' inside a block's attributes array - BBC added a new inline formatting attribute.

Common situations: BBC rolls out underline/strikethrough/link styling on a new article; an old article migrated with a legacy attribute value; a regional BBC endpoint returning an extended attribute set.

Related errors


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

Appendix: source

Thrown at lib/routes/bbc/utils.tsx:65

    blocks?: Block[];
    items?: Block[];
};

const applyAttributes = (content: JSX.Element | string, attributes?: BlockAttribute[]): JSX.Element | string => {
    let result: JSX.Element | string = content;
    const attributeList = attributes ?? [];
    for (const attribute of attributeList) {
        switch (attribute) {
            case 'bold':
                result = <strong>{result}</strong>;
                break;

            case 'italic':
                result = <em>{result}</em>;
                break;

            default:
                throw new Error(`Unhandled attribute: ${attribute}`);
        }
    }
    return result;
};

const extractText = (blocks?: Block[]): string => {
    if (!blocks?.length) {
        return '';
    }

    return blocks
        .map((block) => {
            if (block.type === 'fragment') {
                return block.model?.text ?? '';
            }

            if (block.model?.text) {
                return block.model.text;

View on GitHub (pinned to bed535e087)