What Causes This Error?
This error occurs when the array returned by getStaticPaths() contains entries that are not objects. Each entry must be an object with at least a params property.
The Problem
---
// ❌ Array contains strings instead of objects
export function getStaticPaths() {
return ['post-1', 'post-2', 'post-3'];
}
// ❌ Array contains null
export function getStaticPaths() {
return [null, { params: { slug: 'valid' } }];
}
// ❌ Array contains numbers
export function getStaticPaths() {
return [1, 2, 3];
}
---
The Fix
Use Object Entries
---
// ✅ Each entry is an object with params
export function getStaticPaths() {
return [
{ params: { slug: 'post-1' } },
{ params: { slug: 'post-2' } },
{ params: { slug: 'post-3' } },
];
}
---
Transform Data Properly
---
const slugs = ['post-1', 'post-2', 'post-3'];
// ❌ Wrong
export function getStaticPaths() {
return slugs;
}
// ✅ Correct - map to objects
export function getStaticPaths() {
return slugs.map((slug) => ({
params: { slug },
}));
}
---
Common Scenarios
Filtering Returns Invalid Entries
---
const posts = [
{ slug: 'post-1', published: true },
{ slug: 'post-2', published: false },
{ slug: 'post-3', published: true },
];
// ❌ Wrong order - filter then map leaves non-objects
export function getStaticPaths() {
return posts
.map((post) => post.published ? { params: { slug: post.slug } } : null)
.filter(Boolean); // Works but confusing
}
// ✅ Better - filter first, then map
export function getStaticPaths() {
return posts
.filter((post) => post.published)
.map((post) => ({
params: { slug: post.slug },
}));
}
---
Async Data with Nulls
---
export async function getStaticPaths() {
const data = await fetchData();
// ❌ Some items might be null
return data.map((item) => item && {
params: { id: item.id },
});
}
// ✅ Filter out nulls
export async function getStaticPaths() {
const data = await fetchData();
return data
.filter((item) => item != null)
.map((item) => ({
params: { id: item.id },
}));
}
---
Flattening Nested Arrays
---
const categories = [
{ name: 'tech', posts: ['post-1', 'post-2'] },
{ name: 'life', posts: ['post-3'] },
];
// ❌ Results in nested arrays
export function getStaticPaths() {
return categories.map((cat) =>
cat.posts.map((slug) => ({ params: { slug } }))
);
}
// ✅ Use flatMap
export function getStaticPaths() {
return categories.flatMap((cat) =>
cat.posts.map((slug) => ({
params: { category: cat.name, slug },
}))
);
}
---
Spread Operator Issues
---
// ❌ Spreading strings creates character entries
const slug = 'post';
export function getStaticPaths() {
return [...slug].map((char) => ({ params: { slug: char } }));
// Results in 'p', 'o', 's', 't' as separate paths
}
// ✅ Handle as single item
export function getStaticPaths() {
return [{ params: { slug: 'post' } }];
}
---
Quick Checklist
- Every array entry must be an object
- Each object needs
{ params: { ... } } - Filter out null/undefined before mapping
- Use
.filter()before.map()for cleaner code - Use
.flatMap()for nested data structures