getstaticprops не может использовать параметры из getstaticpaths в случае динамической маршрутизации? MongoDB

#mongodb #parameters #next.js #getstaticprops #getstaticpaths

#mongodb #параметры #next.js #getstaticprops #getstaticpaths

Вопрос:

Я создаю веб-страницу, которая извлекает данные из MongoDB (бесплатный тарифный план atlas BASIC) и имеет страницу динамической маршрутизации с SSG. Страница динамической маршрутизации [cogid].js содержит getstaticpaths и getstaticprops. getstaticpaths, похоже, работает, но getstaticprops не работает. Я предполагаю, что проблема заключается в переменной «params.cogid» внутри getstaticprops…

 import { MongoClient } from "mongodb";
const { MONGODB_URI, MONGODB_DB } = process.env;

export default function Cog({ cogData }) {
  return (
      <div className="container mx-auto px-2 my-5 flex flex-col ">
          <p>COG ID: COG{cogData.cog_id}</p>
          <p>name: {cogData.name}</p>
      </div>
  );
}

export async function getStaticPaths() {
  const client = new MongoClient(MONGODB_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  });
  if (!client.isConnected()) await client.connect();
  const res = await client
    .db(MONGODB_DB)
    .collection("test1")
    .find({})
    .project({ cog_id: 1, _id: 0 })
    .toArray();

  if (client.isConnected()) client.close();

  const paths = res.map((copiedCog) => ({
    params: { cogid: copiedCog.cog_id },
  }));
  return { paths, fallback: false };
}

export async function getStaticProps({ params }) {
  const client = new MongoClient(MONGODB_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  });

  if (!client.isConnected()) await client.connect();
  const resp = await client
    .db(MONGODB_DB)
    .collection("test1")
    .findOne({ cog_id: params.cogid });
  if (client.isConnected()) client.close();

  const cogData = await JSON.parse(JSON.stringify(resp));
  return { props: { cogData } };
}
 

Ответ №1:

Я решил проблему. Я должен был изменить тип данных params.cogid на целое число (из строки?) например, Number(params.cogid) или parseInt(params.cogid). Это потому, что тип поля «cog_id» базы данных является целым числом.