-
라우트 api 분석ai 채팅 2025. 4. 10. 17:07728x90
export async function POST(req: Request) { try { const body = await req.json(); const { dataid, role, userContent } = body; const dogDb = await dogDatas(dataid); async function waitForAiChatData(dataid: number, maxAttempts = 5, delayMs = 300): Promise<DataType[]> { for (let attempt = 0; attempt < maxAttempts; attempt++) { const aiChatDb = await dataSelectAi(dataid, "aidog"); if (aiChatDb && aiChatDb.length > 0) { return aiChatDb; } await new Promise(resolve => setTimeout(resolve, delayMs)); } return []; } const response = await openai.chat.completions.create({ ai의 답변 설정... }); //ai 답변 반환 return NextResponse.json({ aianswer: response.choices[0].message.content }); } catch (error) { return NextResponse.json({ error: "AI 응답 생성 실패" }, { status: 500 }); } }
waitForAiChatData 코드 순서
waitForAiChatData는 DB에 저장된 AI 응답 데이터가 도착할 때까지,
일정 시간 간격으로 최대 5번까지 확인하며 기다리는 함수
[ 특정 조건이 만족될 때까지 기다리는 로직 비동기 데이터가 준비될 때까지 반복적으로 확인하는 구조 ]
waitForAiChatData 코드 순서
async function waitForAiChatData(dataid: number, maxAttempts = 5, delayMs = 300): Promise<DataType[]> {
- dataid: 확인하고 싶은 데이터의 ID
- maxAttempts: 최대 시도 횟수 (기본값 5번)
- delayMs: 각 시도 사이의 대기 시간 (기본값 300ms)
- Promise<DataType[]>: 최종적으로 DataType[] 형식의 데이터를 반환하는 비동기 함수
for (let attempt = 0; attempt < maxAttempts; attempt++) {
- 최대 maxAttempts까지 반복하면서 데이터를 확인
const aiChatDb = await dataSelectAi(dataid, "aidog");
- dataSelectAi라는 비동기 함수로 서버나 DB에서 "aidog" 역할을 가진 데이터를 불러옴
if (aiChatDb && aiChatDb.length > 0) { return aiChatDb; }
- 만약 데이터가 존재하고, 빈 배열이 아니라면, 데이터를 그대로 반환하며 함수 종료.
await new Promise(resolve => setTimeout(resolve, delayMs));
- 아직 원하는 데이터가 없을 경우, delayMs(예: 300ms)만큼 기다리고 다음으로 넘어 감
- setTimeout을 Promise로 감싸서 await로 비동기 대기를 구현.
이 코드를 사용 한 이유
ai의 답변을 반환 한 뒤 클라이언트 컴포넌트로 값이 전달 된 후 데이터 베이스에 저장 되는데
그 값이 저장은 되나 ui에 바로 출력이 안되는 이슈로...어렵네
'ai 채팅' 카테고리의 다른 글
ai 답변이 왜 두개가 저장 되는가? (0) 2025.04.09 데이터 중복 제거 (0) 2025.04.07 작업 하다 보니 문제 사항 파악 (0) 2025.03.21 id 값 가져 오는 부분 막힘2 해결 (0) 2025.03.17 id 값 가져 오는 부분 막힘 (0) 2025.03.14