지난 포스팅에서 Streaming 을 통해서 데이터를 노출하는 것까지 예시를 통해서 완료하였다.
이번에는 ai text 챗. Chatgpt 처럼 중간에 "정지"할 수 있는 기능을 추가하려고 한다.
1. AbortController
// 새로운 AbortController 인스턴스 생성
const abortController = new AbortController()
바로 abortController 기능을 사용하는건데, 해당 기능은 node15 이상부터 사용할 수 있으니 저버전의 서버를 사용하고 계신다면 주의 바랍니다. (그 이하를 쓰는거면 얼마나 오래된겁니까..)
이렇게 abrotController 를 선언하였다면,
// API 요청에 signal 추가
const response = await fetch(`/api/streaming`, {
method: 'POST',
headers: Config.headers,
body: JSON.stringify(requestBody),
signal: abortController.signal, // AbortController의 signal 추가
})
내려온 데이터들을 지속적으로 store에 저장. (while문을 사용하여단어로 끊어져서 내려오는 데이터들을useRetrieveStore에set)
React.js4번화면에서 사용 하도록 한다
2. utils.js - 데이터 전처리
데이터의 포맷이 정상적으로 내려오지 않아서 1.5일 동안 개고생했다.
이 부분인데,
removeLeadingData(String): 데이터의 가장 앞에"data: "로 내려오는 경우가 있어 해당 로직을 추가하였다. (",data:"도 있었다..)
decodeUnicodeString(String):Unicode로 된 데이터를 변환하는 작업.
removeFirstAndLastQuotes(String): Escape 문자열을 처리하는 방법.(진짜 할 때 속터져)
str
.replace(/"{/g, '{') // 문자열 시작의 '"{' 를 '{' 로 변경 (JSON 객체 시작 부분 정리)
.replace(/}"/g, '}') // 문자열 끝의 '}"' 를 '}' 로 변경 (JSON 객체 끝 부분 정리)
.replace(/\\/g, '\\\\') // 단일 백슬래시를 이중 백슬래시로 변경 (이스케이프 처리)
.replace(/"/g, '\\"') // 따옴표를 이스케이프 처리된 따옴표로 변경
.replace(/\t/g, '\\t') // 탭 문자를 이스케이프 처리된 탭으로 변경
4. parseNestedJSON(String|Object): 결국 받아온 값들을 사용하려면JSON.parse(String)이 필요한데, 재귀함수처럼 사용하였다 (사실은 while 반복문) 한 번 파싱했을 때 한개의 요소만 JSON 파싱이 되는 경우가 있어서 만약 String 형태면 다시JSON.parse()해주는 작업을 추가하였다.