'Error: A required parameter (id) was not provided as a string in getStaticPaths for /location/[id] [duplicate]

im working on a next.js and mongodb website and im following this tutorial exactly but with different files/variable names. i keep running into this error when trying to access the dynamic page : Error: A required parameter (id) was not provided as a string in getStaticPaths for /location/[id]

tutorial : https://www.youtube.com/watch?v=MFuwkrseXVE&ab_channel=Academind Just before 2 hours 40 min

PS deleted db info for security reasons

export async function getStaticPaths(){
    const client = await MongoClient.connect(''); ////////// username and password here for mongo db and db name
    const db = client.db();
   
    const destinationsCollection = db.collection('destination');
    const destinations = await destinationsCollection.find({},{_id: 1}).toArray();
    client.close();
    return {
        fallback: false,
        paths: destinations.map((destination) => ({ params: {destinationId: destination._id.toString()},
    })),     
    };
} 


Solution 1:[1]

Your page is /location/[id] so you need to return an id field in the params objects, for example:

{
    params: {
        id: destination._id.toString()
    }
}

The param you use in the dynamic path matters

in your page location e.g. /location/[anythingInside] you need to ensured whatever is inside your params is same with the dynamic name file which is what inside the braces[] you created e.g. should like this:

{
    params: {
        anythingInside: data.id.toString()
    }
}

Whatever you used when creating the file must be same with the data in the param, for example: path/[anythingInside] and params: { anythingInside: { data }} remember anythingInside must be same with what is inside params.

Solution 2:[2]

NextJS is very meticulous with its data fetching functions and you have to be very careful with the way that you return parameters with getStaticPaths() in dynamic routing pages. I believe the problem here is that when you return "params", you store the id of your data (destination._id.toString()) into a JSON variable called "destinationId". However, since the page is called "[id]", Next will be expecting an "id" JSON variable inside of "params". So your final code should look something like this:

export async function getStaticPaths(){
const client = await MongoClient.connect(''); ////////// username and password here for mongo db and db name
const db = client.db();

const destinationsCollection = db.collection('destination');
const destinations = await destinationsCollection.find({},{_id: 1}).toArray();
client.close();
return {
    fallback: false,
    paths: destinations.map((destination) => ({ params: {id: destination._id.toString()},
})),     
};

}

Hopefully this solves the issue!

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Tyler2P
Solution 2 PowerMelon4