{"record":{"id":"e311a2d183eeface","repo":"vercel/next.js","slug":"id-property-is-required-for-every-item-returned-fr","errorCode":null,"errorMessage":"id property is required for every item returned from generateSitemaps","messagePattern":"id property is required for every item returned from generateSitemaps","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/next-core/src/next_app/metadata/route.rs","lineNumber":299,"sourceCode":"            const contentType = {content_type}\n            const cache_control = {cache_control}\n            const fileType = {file_type}\n\n            if (typeof handler !== 'function') {{\n                throw new Error('Default export is missing in {resource_path}')\n            }}\n\n            export async function GET(_, ctx) {{\n                const paramsPromise = ctx.params\n                const idPromise = paramsPromise.then(params => params?.__metadata_id__)\n\n                const id = await idPromise\n                const hasXmlExtension = id ? id.endsWith('.xml') : false\n                const sitemaps = await generateSitemaps()\n                let foundId\n                for (const item of sitemaps) {{\n                    if (item?.id == null) {{\n                        throw new Error('id property is required for every item returned from generateSitemaps')\n                    }}\n                    const baseId = id && hasXmlExtension ? id.slice(0, -4) : undefined\n                    if (item.id.toString() === baseId) {{\n                        foundId = item.id\n                    }}\n                }}\n                if (foundId == null) {{\n                    return new NextResponse('Not Found', {{\n                        status: 404,\n                    }})\n                }}\n                \n                const targetIdPromise = idPromise.then(id => {{\n                    const hasXmlExtension = id ? id.endsWith('.xml') : false\n                    return id && hasXmlExtension ? id.slice(0, -4) : undefined\n                }})\n                const data = await handler({{ id: targetIdPromise }})\n                const content = resolveRouteData(data, fileType)","sourceCodeStart":281,"sourceCodeEnd":317,"githubUrl":"https://github.com/vercel/next.js/blob/0ae8c72462952df163f1b1e0726641bc5b40dc93/crates/next-core/src/next_app/metadata/route.rs#L281-L317","documentation":"Thrown at request time (or prerender) inside the generated sitemap-with-generateSitemaps GET handler when iterating the array returned by generateSitemaps() and finding an item whose `id` is null or undefined. Each sitemap chunk must be addressable by id (used to build the route param __metadata_id__), so a missing id is fatal. The check is `item?.id == null`.","triggerScenarios":"generateSitemaps returns an array where some element lacks an id field, has id: null, or returns primitives/objects without id. Returning a non-array or an array of strings also triggers it if the strings are not objects with id.","commonSituations":"Returning [{ name: 'x' }] instead of [{ id: 'x' }]; fetching ids from a DB where some are null; returning the raw entity list instead of mapping to { id }.","solutions":["Ensure every item in the generateSitemaps return array has a non-null id property.","Map your data source to { id: <value> } objects before returning.","Filter out items with null/undefined ids before returning."],"exampleFix":"// before: app/sitemap.ts\nexport async function generateSitemaps() {\n  return categories.map(c => ({ name: c.slug })) // missing id\n}\n\n// after\nexport async function generateSitemaps() {\n  return categories.map(c => ({ id: c.slug }))\n}","handlingStrategy":"validation","validationCode":"// Validate generateSitemaps output shape before returning\nfunction assertSitemapIds(items: unknown[]): asserts items is { id: string | number }[] {\n  for (const item of items) {\n    if (item == null || (item as any)?.id == null) {\n      throw new Error('Every generateSitemaps item must have a non-null id')\n    }\n  }\n}\nexport async function generateSitemaps() {\n  const items = await fetchIds()\n  assertSitemapIds(items)\n  return items\n}","typeGuard":"type SitemapItem = { id: string | number }\nconst hasId = (v: unknown): v is SitemapItem =>\n  v != null && typeof (v as any)?.id === 'string' || typeof (v as any)?.id === 'number'","tryCatchPattern":"null","preventionTips":["Map DB/source rows to { id } objects explicitly before returning from generateSitemaps.","Filter out null-id rows at the data layer.","Add a unit test asserting every generateSitemaps item has a non-null id."],"tags":["sitemap","metadata-routes","app-router","validation"],"analyzedSha":"0ae8c72462952df163f1b1e0726641bc5b40dc93","analyzedAt":"2026-08-06T19:44:29.143Z","schemaVersion":2},"datasetVersion":"2026-08-07T02:17:10.218Z"}