gatsbyjs/gatsby · error · Error
You've passed something other than string to the exclude…
Error message
You've passed something other than string to the exclude array. This is supported, but you'll have to write a custom filter function.
Ignoring the input for now: ${JSON.stringify(excludedRoute, null, 2)}
https://www.gatsbyjs.com/plugins/gatsby-plugin-sitemap/#api-reference
What it means
gatsby-plugin-sitemap's defaultFilterPages applies each entry of the `exclude` option against page URLs via minimatch. The default implementation only handles string entries (glob patterns). If an entry is not a string (a RegExp, function, object, or number), it throws and points the user to the API reference to supply a custom `filterPages` function instead. The message says non-string entries are 'supported' only via a custom filter, not via the default.
Solutions
- Convert RegExp excludes to minimatch glob strings, e.g. use '/draft/**' instead of /\/draft\//.
- If you need RegExp/function logic, provide a custom options.filterPages function and do the matching yourself.
- Ensure every element of the exclude array is a string when using the default filter.
Example fix
// before
{
resolve: `gatsby-plugin-sitemap`,
options: { exclude: [`/secret`, /\?lang=/] }
}
// after (glob string)
{
resolve: `gatsby-plugin-sitemap`,
options: { exclude: [`/secret`, `/*?lang=*`] }
}
// or custom filter for regex logic
options: { filterPages: (page, excludedRoutes) => excludedRoutes.every(...) } Defensive patterns
Strategy: type-guard
Validate before calling
function normalizeExcludes(exclude) {
const arr = Array.isArray(exclude) ? exclude : [];
const bad = arr.filter(e => typeof e !== 'string');
if (bad.length) {
throw new Error('gatsby-plugin-sitemap exclude entries must be strings; ' +
'use a custom filterPages for RegExp/function logic.');
}
return arr;
} Type guard
function isStringArray(arr) {
return Array.isArray(arr) && arr.every(e => typeof e === 'string');
} Prevention
- Express excludes as minimatch globs, not RegExp.
- Provide a custom filterPages function when you need regex/function matching.
- Lint gatsby-config.js to assert exclude is a string[].
When it happens
Trigger: Configuring the plugin with options.exclude containing a RegExp (e.g. /\/draft\//), a function, an object, or any non-string, e.g. { resolve: 'gatsby-plugin-sitemap', options: { exclude: ['/secret', /\?lang=/] } }.
Common situations: Wanting regex exclusion (common need) and assuming the default filter accepts RegExp; migrating from another sitemap plugin that allowed functions; passing an object like { path: '/x' } by mistake.
Related errors
- Invalid options passed to page Filter function
- createNode must be a function, was
- createNodeId must be a function, was
- Neither "cache" or "getCache" was passed. getCache must be…
- Neither "cache" or "getCache" was passed. getCache must be…
AI-assisted analysis of gatsbyjs/gatsby@8b06340921 (2026-08-13).
Data as JSON: /api/errors/34948fb4ca9f6048.
Report an issue: GitHub.
Appendix: source
Thrown at packages/gatsby-plugin-sitemap/src/internals.js:110
*
* This allows filtering any data in any way.
*
* This Function is executed via allPages.filter((page) => !excludes.some((excludedRoute) => thisFunc(page, ecludedRoute, tools)))
* allPages is the results of the resolvePages
*
* @param {object} page
* @param {string} excludedRoute - Array from plugin config `options.exclude`
* @param {object} tools - contains required tools for filtering
*
* @returns {boolean}
*/
export function defaultFilterPages(
page,
excludedRoute,
{ minimatch, withoutTrailingSlash, resolvePagePath }
) {
if (typeof excludedRoute !== `string`) {
throw new Error(
`You've passed something other than string to the exclude array. This is supported, but you'll have to write a custom filter function.
Ignoring the input for now: ${JSON.stringify(excludedRoute, null, 2)}
https://www.gatsbyjs.com/plugins/gatsby-plugin-sitemap/#api-reference
`
)
}
// Minimatch is always scary without an example
// TODO add example
return minimatch(
withoutTrailingSlash(resolvePagePath(page)),
withoutTrailingSlash(excludedRoute)
)
}
/**
* @name serialize
*View on GitHub (pinned to 8b06340921)