programing

JavaScript에서 응답 본문을 다시 읽습니다.

goodjava 2023. 4. 5. 21:48

JavaScript에서 응답 본문을 다시 읽습니다.

fetch()는 (성공한 경우) 어느 것이 오브젝트로 해결되는지 확약을 반환합니다.매우 일반적인 방법은 응답 본문을 JSON 개체로 변환하기 위해 즉시 호출하는 것입니다.

응답 본문이 유효한 JSON이 아닌 경우Response.json()약속에 실패하고 오류가 발생.메시지는 다음과 같습니다.

위치 0의 JSON에 예기치 않은 토큰 X가 있습니다.

문제를 진단할 때는 그다지 도움이 되지 않습니다.이상적으로는 서버에서 콘텐츠를 볼 수 있으면 좋겠습니다(이것은 에러 메시지인 경우가 많습니다.

단, 스트림을 읽을 수 있는 것은 다음 주소뿐입니다.Response.body한 번(최소한 크롬에서는)(읽기 전용 플래그도 있습니다.)그런 일은 이미 일어났다Response.json()는 본문을 JSON으로 변환하려고 하기 때문에 JSON 해석 실패 시 본문이 영원히 손실된 것으로 보입니다.

원래 대응 주체를 회복할 방법은 없을까?원본을 수동으로 읽는 것(그리고 JSON으로 변환)이 부족할 경우fetch약속 해결?

복제에 사용Response

let clone = response.clone();

또는 를 사용합니다.Response.body.getReader()그러면 a가 반환됩니다.ReadableStream읽다Response하나의 흐름으로서TextDecoder()개종하다Uint8Array데이터 스트림에서 텍스트로

가끔 JSON 응답을 망치는 API를 처리해야 했습니다.response.json()응답 개체를 복제했습니다.catch 블록을 사용하여 오류가 SyntaxError인지 확인하고 응답 클론의 텍스트 결과를 사용하여 오류를 수정할 수 있습니다.

약간 이런 느낌이에요.

var brokenJson = function (url) {
    var responseCopy;
    return fetch(url)
    .then(function (response) {
        responseCopy = response.clone();
        return response.json();
    }).catch(function (err) {
        if (err instanceof SyntaxError) {
            return responseCopy.text()
            .then(function(data) {
                return fixJson(data);
            });
        }
        else {
            throw err;
        }
    }).then(function (json) {
        // do things
    });
};

fixJson수신한 데이터를 수정하는 기능일 뿐입니다.내 경우 JSON이 고장났을 때 항상 같은 방식으로 파손되어 있었습니다.선행 {or trailing}이(가) 추가되어 있었다고 생각합니다.기억할 수 없습니다.

질문을 다시 읽으면 json을 수정하기보다는 콘솔에 오류를 기록할 가능성이 높습니다. 쉽게 다시 씁니다.

var brokenJson = function (url) {
    var responseCopy;
    return fetch(url)
    .then(function (response) {
        responseCopy = response.clone();
        return response.json();
    }).catch(function (err) {
        if (err instanceof SyntaxError) {
            return responseCopy.text()
            .then(function(text) {
                console.error(text);
                throw err;
            });
        }
        else {
            throw err;
        }
    }).then(function (json) {
        // do things
    });
};

response.json()을 변수에 할당하고 반환하는 것은 나에게 효과가 있었습니다.clone()이 다시 잠겼다고 말했습니다.

fetch("http://localhost:3000/watchlist")
    .then(response => {
      var res = response.json();
      return res;
    })
    .then(data => {
      console.log(data);
      this.setState({ data });
    });

나는 사용했다JSON.parse(response.resp.data)클론이 작동하지 않았던 것 같아요

언급URL : https://stackoverflow.com/questions/40497859/reread-a-response-body-from-javascripts-fetch