{"record":{"id":"1de6a89c2a4673a0","repo":"DIYgod/RSSHub","slug":"comic-not-found-name","errorCode":null,"errorMessage":"Comic Not Found - ${name}","messagePattern":"Comic Not Found - (.+?)","errorType":"exception","errorClass":null,"httpStatus":503,"severity":"error","filePath":"lib/routes-deprecated/gocomics/index.js","lineNumber":26,"sourceCode":"    const url = `${baseURL}/${name}/`;\n    const response = await got({\n        method: 'get',\n        url,\n    });\n\n    const data = response.data;\n    const $ = cheerio.load(data);\n\n    // Determine Comic and Author from main page\n    const comic = $('.media-heading').eq(0).text();\n    const author = $('.media-subheading').eq(0).text().replace('By ', '');\n\n    // Load previous comic URL\n    const items = [];\n    let previous = $('.gc-deck--cta-0 a').attr('href');\n\n    if (!previous) {\n        throw new Error(`Comic Not Found - ${name}`);\n    }\n\n    while (items.length < limit) {\n        const link = `${baseURL}${previous}`;\n        /* eslint-disable no-await-in-loop */\n        const item = await ctx.cache.tryGet(link, async () => {\n            const detailResponse = await got({\n                method: 'get',\n                url: link,\n            });\n            const content = cheerio.load(detailResponse.data);\n\n            const title = content('h1.m-0').eq(0).text();\n            const image = content('.comic.container').eq(0).attr('data-image');\n            const description = `<img src=\"${image}\" />`;\n            // Pull the date out of the URL\n            const pubDate = new Date(link.split('/').slice(-3).join('/')).toUTCString();\n            const previous = content('.js-previous-comic').eq(0).attr('href');","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/DIYgod/RSSHub/blob/bed535e0879dc71c5aff6f1e7bd1ac21ede40115/lib/routes-deprecated/gocomics/index.js#L8-L44","documentation":"Thrown by the gocomics route when the comic landing page yields no 'previous comic' link, i.e. `$('.gc-deck--cta-0 a').attr('href')` is undefined. The route treats a missing previous-link as 'this comic does not exist (or the page is not a real comic page)' and aborts, including the requested name in the message.","triggerScenarios":"The `name` path parameter does not match a real gocomics comic slug; the comic was removed/renamed; gocomics changed its page markup so the `.gc-deck--cta-0` selector no longer matches; the page returned an error/redirect that still has no previous link.","commonSituations":"Typo in the comic slug (e.g. '/calvinandhobbes' vs '/calvinandhobbes'); requesting a comic that was retired; site redesign breaks the selector; geo-block returns a stub page.","solutions":["Open https://www.gocomics.com/<name> in a browser and confirm it is a valid comic.","Correct the slug to the canonical one shown on gocomics.com.","If the slug is valid but the error persists, the selector likely broke — update `.gc-deck--cta-0 a` in the route and report upstream.","Verify the request is not being geo-blocked or redirected."],"exampleFix":"// before\n/gocomics/calvinandhobes\n// after\n/gocomics/calvinandhobbes","handlingStrategy":"validation","validationCode":"const previous = $('.gc-deck--cta-0 a').attr('href');\nif (!previous) throw new Error(`Comic Not Found - ${name}`);","typeGuard":"const isRealComicPage = ($: cheerio.CheerioAPI): boolean =>\n  !!$('.gc-deck--cta-0 a').attr('href') && !!$('.media-heading').eq(0).text();","tryCatchPattern":null,"preventionTips":["Validate the slug resolves on gocomics.com before subscribing.","Treat a missing previous-link as a 404, not a transient retry.","Pin the route selector against a saved HTML fixture."],"tags":["scraping","routes","validation","markup-drift"],"backgroundTag":null,"analyzedSha":"bed535e0879dc71c5aff6f1e7bd1ac21ede40115","analyzedAt":"2026-08-12T19:29:35.364Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}