{"record":{"id":"734ff11237ed32cb","repo":"DIYgod/RSSHub","slug":"at-least-one-valid-search-parameter-is-required","errorCode":null,"errorMessage":"At least one valid search parameter is required","messagePattern":"At least one valid search parameter is required","errorType":"exception","errorClass":"InvalidParameterError","httpStatus":null,"severity":"warning","filePath":"lib/routes/discord/search.ts","lineNumber":67,"sourceCode":"        max_id: parsed.get('max_id') ?? undefined,\n        channel_id: parsed.get('channel_id') ?? undefined,\n        pinned: parsed.has('pinned') ? queryToBoolean(parsed.get('pinned')) : undefined,\n    };\n\n    return Object.fromEntries(Object.entries(params).filter(([, value]) => value !== undefined));\n};\n\nasync function handler(ctx) {\n    const { authorization } = config.discord || {};\n    if (!authorization) {\n        throw new ConfigNotFoundError('Discord RSS is disabled due to the lack of authorization config');\n    }\n\n    const { guildId } = ctx.req.param();\n    const searchParams = parseSearchParams(ctx.req.param('routeParams'));\n\n    if (!Object.keys(searchParams).length) {\n        throw new InvalidParameterError('At least one valid search parameter is required');\n    }\n\n    const [guildInfo, searchResult] = await Promise.all([getGuild(guildId, authorization), searchGuildMessages(guildId, authorization, searchParams)]);\n\n    if (!searchResult?.messages?.length) {\n        return {\n            title: `Search Results - ${guildInfo.name}`,\n            link: `${baseUrl}/channels/${guildId}`,\n            item: [],\n            allowEmpty: true,\n        };\n    }\n\n    const messages = searchResult.messages.flat().map((message) => ({\n        title: message.content.split('\\n', 1)[0] || '(no content)',\n        description: renderDescription({ message, guildInfo }),\n        author: message.author.global_name ?? message.author.username,\n        pubDate: parseDate(message.timestamp),","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/DIYgod/RSSHub/blob/bed535e0879dc71c5aff6f1e7bd1ac21ede40115/lib/routes/discord/search.ts#L49-L85","documentation":"The Discord search route accepts routeParams (URL path parameters) that are parsed into search parameters: content, author_id, min_id, max_id, channel_id, and pinned. If none of these are provided or all are undefined after parsing, an InvalidParameterError is thrown because Discord's search API requires at least one search criterion.","triggerScenarios":"The user accesses /discord/search/:guildId/:routeParams where routeParams is empty or contains only unrecognized keys. parseSearchParams filters out undefined values, and if Object.keys(searchParams).length is 0, the error fires. This is a user-input validation error, not a config or API issue.","commonSituations":"User omits the routeParams segment entirely; user provides only invalid parameters that get filtered out; user provides parameters with empty values (e.g., 'content=') which become undefined; the routeParams encoding is incorrect (not properly URL-encoded key=value pairs).","solutions":["Provide at least one valid search parameter in the route path, e.g., /discord/search/<guildId>/content=keyword.","Valid parameters are: content, author_id, min_id, max_id, channel_id, pinned.","Ensure parameters are properly formatted as key=value pairs separated by slashes or appropriate delimiters.","Check the route documentation for the exact routeParams format."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const searchParams = parseSearchParams(ctx.req.param('routeParams'));\nconst validParams = ['content', 'author_id', 'min_id', 'max_id', 'channel_id', 'pinned'];\nif (!Object.keys(searchParams).length) {\n    throw new InvalidParameterError(`At least one search parameter required. Valid params: ${validParams.join(', ')}. Example: /discord/search/<guildId>/content=hello`);\n}","typeGuard":"function hasSearchParams(params: Record<string, unknown>): boolean {\n    return Object.keys(params).length > 0;\n}","tryCatchPattern":null,"preventionTips":["Always include at least one search parameter in the route path.","Review valid parameter names before constructing the route URL.","Test the routeParams encoding to ensure parameters are parsed correctly."],"tags":["discord","validation","input-validation","search","invalid-parameter"],"backgroundTag":null,"analyzedSha":"bed535e0879dc71c5aff6f1e7bd1ac21ede40115","analyzedAt":"2026-08-12T19:29:35.364Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}