ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 라우트 api 분석
    ai 채팅 2025. 4. 10. 17:07
    728x90

     

    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에 바로 출력이 안되는 이슈로...어렵네

Designed by Tistory.