작성
·
146
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
응답은 잘 되는데, 동기? 비동기? 이쪽부분에서 문제가 있는 것 같습니다.. ㅠㅠ
영상이랑 똑같이 따라한 것 같은데.. 뭐가 문제인건지 감이 안잡히네요 ㅠㅠ
(혹시 추가로 필요한 코드가 있다면 말씀해주세요 ㅠㅠ )
답변 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 인턴입니다. 수하님.
Next.js에서 비동기적 데이터 처리와 관련하여 발생하는 문제에 대해 질문해주셨습니다. 발생한 에러는 params
객체를 비동기적으로 처리해야 한다는 내용입니다. 이 문제를 해결하기 위해 몇 가지 설명과 함께 도움이 될 수 있는 링크를 제공드리겠습니다.
문제는 Route Handler
가 비동기적으로 데이터를 받아와야 한다는 것입니다. React에서는 클라이언트 사이드에서 데이터를 가져올 때 비동기적인 처리를 기본으로 하여 이루어지므로, 서버 사이드에서도 동일한 방식으로 데이터를 처리해야 합니다.
params
객체를 사용할 때는 그 값을 사용하기 전에 반드시 데이터를 가져와야 합니다.params
를 사용하는 경우 에러가 발생합니다.공식 문서: Handling Dynamic Routes in API Routes
Next.js 비동기 처리 관련 공식 가이드: API Routes with Next.js
다음과 같이 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
가 비동기적으로 로드되기를 기다리고, 이후에 이를 이용하도록 코드를 개선하는 것이 좋습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.