You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
이 오류는 스트리밍 데이터가 JSON 형태가 아닌 SSE(SERVER-SENT EVENTS) 형식으로 전달되기 때문에 발생합니다. SSE 데이터는 data: {"key": "value"}처럼 data: 접두사를 포함하며, JSON 파싱을 위해서는 이 접두사를 제거해야 합니다.
수정된 코드
아래는 data: 접두사를 처리하여 JSON 데이터를 올바르게 파싱하도록 수정한 코드입니다:
consthandleSend=async()=>{if(!message.trim()||isProcessing)return;setIsProcessing(true);constuserMessage={content: message.trim(),is_user: true,role: "user"};try{// 사용자 메시지를 즉시 반영awaitonSend(message.trim(),true);// 메시지 전송 성공 시 입력창 초기화setMessage("");if(textareaRef.current){textareaRef.current.style.height="auto";// 높이 초기화}console.log("Sending request to /api/chat with body:",{messages: [userMessage],});// GPT 스트리밍 요청constresponse=awaitfetch("/api/chat",{method: "POST",headers: {"Content-Type": "application/json"},body: JSON.stringify({messages: [userMessage]}),});constreader=response.body.getReader();constdecoder=newTextDecoder("utf-8");letaccumulatedText="";// 누적된 텍스트를 저장할 변수while(true){const{ done, value }=awaitreader.read();if(done)break;// 데이터를 디코딩constchunk=decoder.decode(value);// SSE 형식에서 `data:` 접두사를 제거constlines=chunk.split("\n");for(constlineoflines){if(line.startsWith("data:")){constjsonString=line.replace(/^data:\s*/,"");// `data:` 제거if(jsonString.trim()==="[DONE]"){console.log("Stream finished");break;}try{constparsedData=JSON.parse(jsonString);// JSON 파싱constcontent=parsedData.content||"";// content만 추출// 누적 텍스트 업데이트accumulatedText+=content;// 스트리밍 데이터를 실시간 반영onStreamUpdate(accumulatedText,false);}catch(err){console.error("Error parsing JSON:",err);}}}}// 최종 응답을 부모 함수에 전달onSend(accumulatedText);}catch(error){console.error("Error fetching GPT response:",error);}finally{setIsProcessing(false);setMessage("");// 입력창 초기화if(textareaRef.current){textareaRef.current.style.height="auto";// 높이 초기화}}};
주요 변경 내용
data: 접두사 처리:
SSE 메시지는 data: {...} 형식으로 전달되므로, 각 줄을 확인하여 data: 접두사를 제거합니다.
줄 단위로 데이터 처리:
chunk를 \n으로 분리하여 각 줄을 개별적으로 처리합니다.
line.startsWith("data:")로 유효한 데이터를 필터링합니다.
[DONE] 처리:
OpenAI 스트리밍이 끝나면 [DONE] 메시지가 전달되므로, 이를 감지하여 루프를 종료합니다.
JSON 파싱 에러 처리:
try-catch를 통해 JSON 파싱 중 발생할 수 있는 오류를 처리합니다.
스트리밍 결과
이제 content만 추출하여 누적된 텍스트를 실시간으로 UI에 반영할 수 있습니다. 🎉
추가 작업:
onStreamUpdate 함수에서 받은 accumulatedText를 UI에 실시간으로 렌더링하도록 설정하세요.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
이 오류는 스트리밍 데이터가 JSON 형태가 아닌 SSE(SERVER-SENT EVENTS) 형식으로 전달되기 때문에 발생합니다. SSE 데이터는
data: {"key": "value"}
처럼data:
접두사를 포함하며, JSON 파싱을 위해서는 이 접두사를 제거해야 합니다.수정된 코드
아래는
data:
접두사를 처리하여 JSON 데이터를 올바르게 파싱하도록 수정한 코드입니다:주요 변경 내용
data:
접두사 처리:data: {...}
형식으로 전달되므로, 각 줄을 확인하여data:
접두사를 제거합니다.줄 단위로 데이터 처리:
chunk
를\n
으로 분리하여 각 줄을 개별적으로 처리합니다.line.startsWith("data:")
로 유효한 데이터를 필터링합니다.[DONE]
처리:[DONE]
메시지가 전달되므로, 이를 감지하여 루프를 종료합니다.JSON 파싱 에러 처리:
try-catch
를 통해 JSON 파싱 중 발생할 수 있는 오류를 처리합니다.스트리밍 결과
이제
content
만 추출하여 누적된 텍스트를 실시간으로 UI에 반영할 수 있습니다. 🎉추가 작업:
onStreamUpdate
함수에서 받은accumulatedText
를 UI에 실시간으로 렌더링하도록 설정하세요.Beta Was this translation helpful? Give feedback.
All reactions