inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Next.js App router 기반 Chat GPT 만들기

Dynamic Route, Route Group, Route Handler

Route Handler 에서 Post 코드 작성해봤는데 계속 에러가 납니다 ㅠㅠ

296

수하

작성한 질문수 31

0

제가 수업을 기반으로 작성한 코드는 다음과 같습니다.

import { NextResponse } from "next/server";

export async function POST(request: Request, {params}: {params: {testId: string}}){
    const userData = await request.json();
    console.log("server user data", userData);
    console.log("server param", params.testId);

    return NextResponse.json({message: "사용자가 성공적으로 생성되었습니다."});
}
"use client";


export default function Page({params} : {params: {id:string}}){
    const handlerSubmit = async (e:React.FormEvent) => {
        const response = await fetch('/api/test/1234', {
            method: "POST",
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({name: 'test name', email: 'test email'}),
        });

        console.log(e);
        const data = await response.json();
        console.log("response data", data);

    }


    return (<>다이나믹 라우트 페이지: {params.id}
        <button
            type="submit"
            onClick={handlerSubmit}>
        전송
        </button>
    </>);
}

 

 

에러 메시지는 다음과 같습니다.

 ✓ Compiled /dashboard/[id] in 1716ms (597 modules)
Error: Route "/dashboard/[id]" used `params.id`. `params` should be awaited before using its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis
    at id (c:\study\chatgpt-clone\next-tutorial\app\dashboard\[id]\page.tsx:21:36)
  19 |
  20 |
> 21 |     return (<>다이나믹 라우트 페이지: {params.id}
     |                                    ^
  22 |         <button
  23 |             type="submit"
  24 |             onClick={handlerSubmit}>
 GET /dashboard/12345 200 in 2989ms
 ✓ Compiled /favicon.ico in 406ms (331 modules)
 GET /favicon.ico 200 in 543ms
 ✓ Compiled /api/test/[testId] in 337ms (614 modules)
server user data { name: 'test name', email: 'test email' }
Error: Route "/api/test/[testId]" used `params.testId`. `params` should be awaited before using its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis
    at testId (c:\study\chatgpt-clone\next-tutorial\app\api\test\[testId]\route.ts:6:39)
  4 |     const userData = await request.json();
  5 |     console.log("server user data", userData);
> 6 |     console.log("server param", params.testId);
    |                                       ^
  7 |
  8 |     return NextResponse.json({message: "사용자가 성공적으로 생성되었습니다."});
  9 | }
server param 1234
 POST /api/test/1234 200 in 1402ms

 

응답은 잘 되는데, 동기? 비동기? 이쪽부분에서 문제가 있는 것 같습니다.. ㅠㅠ

 

영상이랑 똑같이 따라한 것 같은데.. 뭐가 문제인건지 감이 안잡히네요 ㅠㅠ

 

(혹시 추가로 필요한 코드가 있다면 말씀해주세요 ㅠㅠ )

react typescript next.js tailwindcss zustand chatgpt

답변 2

1

코딩먹방

아래 AI 댓글에 답변을 달았네요 ㅠㅠ 다시 답변에 달겠습니다!


안녕하세요!
아마 이번에 nextjs 를 설치하고 따라오셨다면 15 버전이 설치되셨을거에요!

15버전부터는 params 가 async 로 바뀌어서 해당 부분에 대한 처리를 하셔야합니다!

새소식에 적어 놓긴 했는데 다시 한번 안내해드릴게요!!

아래와 같이 수정하시면 잘 되실겁니다

route.ts

import { NextResponse } from "next/server";

// params 는 async 이기 때문에 Promise 로 감싸서 타이핑
type Params = Promise<{ testId: string }>;

export async function POST(request: Request, segmentData: { params: Params }) {
  const userData = await request.json();
  // params을 사용할 때 역시 await를 붙여주시면 됩니다.
  const params = await segmentData.params;
  console.log("server user data", userData);
  console.log("server params", params.testId);
  return NextResponse.json(
    { message: "성공적으로 생성하였습니다." },
    { status: 201 }
  );
}

 

page.tsx

import { use } from "react";

// page 역시도 params 부분은 Promise로 감싸줍니다.
type Params = Promise<{ testId: string }>;

export default function TestDetailPage(props: { params: Params }) {
  // client page 에서는 await를 사용할 수 없으므로 react에서 새로 추가된 use hook으로 받아주시면 됩니다.
  const { testId } = use(props.params);

  const handleSubmit = async () => {
    const response = await fetch("/api/test/1234", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ name: "test name", email: "test email" }),
    });

    const data = await response.json();

    console.log("client data", data);
  };
  return (
    <>
      테스트 디테일 페이지: {testId}
      <button type="submit" onClick={handleSubmit}>
        전송
      </button>
    </>
  );
}

 

바뀐 부분에 대해서는 아래 링크를 참고해주세요!

https://nextjs.org/docs/app/building-your-application/upgrading/version-15#asynchronous-page

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 수하님.
Next.js에서 비동기적 데이터 처리와 관련하여 발생하는 문제에 대해 질문해주셨습니다. 발생한 에러는 params 객체를 비동기적으로 처리해야 한다는 내용입니다. 이 문제를 해결하기 위해 몇 가지 설명과 함께 도움이 될 수 있는 링크를 제공드리겠습니다.

문제의 원인

문제는 Route Handler가 비동기적으로 데이터를 받아와야 한다는 것입니다. React에서는 클라이언트 사이드에서 데이터를 가져올 때 비동기적인 처리를 기본으로 하여 이루어지므로, 서버 사이드에서도 동일한 방식으로 데이터를 처리해야 합니다.

주요 내용 요약

  • params 객체를 사용할 때는 그 값을 사용하기 전에 반드시 데이터를 가져와야 합니다.
  • 이는 특히 dynamic route에서 중요하며, 데이터를 가져오기 전에 params를 사용하는 경우 에러가 발생합니다.

참고자료

  1. 공식 문서: Handling Dynamic Routes in API Routes

    • 이 문서에서는 dynamic API 라우트를 처리하는 방법에 대해 설명하고 있습니다. 위 에러 메시지에서 안내하는 링크로, 정확한 비동기 처리 방법을 이해하는데 도움이 될 것입니다.
  2. Next.js 비동기 처리 관련 공식 가이드: API Routes with Next.js

    • API 라우트를 구현하는 기본적인 방법과 이를 비동기적으로 다루는 방법에 대해 설명하고 있습니다.
  3. 다음과 같이 params를 처리하는 것을 고려할 수 있습니다:

    export async function POST(request: Request, {params}: {params: {testId: string}}){
        const userData = await request.json();
        console.log("server user data", userData);
    
    
        // Safely access params after ensuring they are fully available
        if(params && params.testId){
            console.log("server param", params.testId);
        }
    
    
        return NextResponse.json({message: "사용자가 성공적으로 생성되었습니다."});
    }
    

기본적으로 params가 비동기적으로 로드되기를 기다리고, 이후에 이를 이용하도록 코드를 개선하는 것이 좋습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

2605 이후 최신 클로드코드 강의 추가 부탁드립니다.

0

6

1

커리큘럼 문서 제공받을 수 있을까요?

0

9

0

[13번 강의] ChatInterface에 PDF 렌더링이 안되는 이슈 공유

-1

7

1

ThemeProvider를 이용해서 NextThemeProvider를 따로 생성하여 Layout.tsx에 적용하는 이유는 뭘까요?

0

8

1

인덱스드 엑세스타입 실무질문

0

8

2

에이전트 에러

0

12

1

커스텀 에이전트 생성하기

0

8

1

강의 잘 들었습니다만 부탁이 하나 있어서요..

0

12

2

mission 09-01 을 수행할 수 없어요

0

16

1

롱폼 영상 강의도 있으신가요? 도움이 많이 되었습니다.

1

10

1

outputStyle 설정하는데 어디서 문제일까요?

0

10

2

무서워요 다음에는... 조심.

1

16

1

test.txt파일 삭제시 rm명령어이니 클로드의 질문이 있어야 한다고 하셨는데

0

7

1

검은화면

0

14

2

강의교환링크안열려요.....

0

14

1

영상재생에러 [확인부탁드려요!!!]

0

14

1

클로드 채팅에서 코드로 넘어가기

0

23

1

섹션6 헤더 마크업 - zustand 적용에 오류가 발생합니다

0

157

2

page loading... 이 안보입니다.

0

111

2

Streaming 관련 질문

0

135

2

loading이 동작하지 않습니다.

0

255

2

Runtime Error

0

217

2

섹션7 사이드바 &대화페이지 연동 9분50초경 질문

0

210

1

섹션7 사이드바 &대화페이지 연동 3분50초경 질문

0

188

1