프로젝트

[떡국] 트러블슈팅 _ next.js [slug]

stella0905 2023. 12. 27. 18:53

slug에 my가 들어올때 그거에 해당하는 데이터를 가지고 와야하는데 

자꾸 slug가 undefined라고 뜬다.

 

[data]

[
  {
    "id": "my",
    "nickname": "공주",
    "디데이": 30,
    "편지총개수": 7,
    "고명정보": [
      { "닉네임": "123", "고명키값": "딸기" },
      { "닉네임": "456", "고명키값": "고수" },
      { "닉네임": "789", "고명키값": "오이" },
      { "닉네임": "135", "고명키값": "페퍼론치노" },
      { "닉네임": "245", "고명키값": "파" },
      { "닉네임": "567", "고명키값": "계란" },
      { "닉네임": "64544", "고명키값": "고기" }
    ],
    "테이블매트정보": "빨강",
    "인입유저떡국설정완료여부": true
  }
]

[services]

import path from 'path'
import { promises as fs } from 'fs'

export type Tteokguk = {
  nickname: string
  id: string
  디데이: number
  편지총개수: number
  고명정보: [{ 닉네임: string; 고명키값: string }]
  테이블매트정보: string
  인입유저떡국설정완료여부?: boolean
}

export async function getTteokguks(): Promise<Tteokguk[]> {
  // JSON파일 경로 가져오기
  const filePath = path.join(process.cwd(), 'data', 'main.json')
  // 가져온 JSON파일에 데이터 가져오기
  const data = await fs.readFile(filePath, 'utf-8')
  return JSON.parse(data)
}

export async function getTteokguk(id: string): Promise<Tteokguk | undefined> {
  const tteokguk = await getTteokguks()
  // console.log('tteokguk', tteokguk)
  console.log('id', id)
  return tteokguk.find((item) => item.id === id)
}

[main.tsx]

import { getTteokguk, getTteokguks } from '@/services/main'

type Props = {
  params: {
    slug: string
  }
}

export default async function DishPage({ params: { slug } }: Props) {
  const 떡국 = await getTteokguk(slug)
  if (!떡국) {
    console.log('해당떡국없음')
  }

  return (
    <div>
      <h1></h1>
      <div>{`까치까치 설날 D- `}</div>
    </div>
  )
}

export async function generateStaticParams() {
  const tteokguks = await getTteokguks()
  console.log(tteokguks)
  return tteokguks.map((tteokguk) => ({
    slug: tteokguk.id,
  }))
}

 

아래 generateStaticParams() 함수는 정상적으로 데이터가 잘 나오는 상황이다. 

 

 

[해결 방법]

 

강의로만 봤다가 실전으로 하려다보니 slug를 [slug]로 사용하지 않고 [userId]로 사용을 해서 찾지 못했던 거였다 .

결국엔 

export default async function DishPage({ params: { userId } }: Props) {
  const 떡국 = await getTteokguk(userId)
  if (!떡국) {
    console.log('해당떡국없음')
  }

userId로 넣어주면 정상적으로 id를 받아올 수 있었다.