ReadableStream 객체에서 데이터를 검색 하시겠습니까?


135

ReadableStream객체 로부터 정보를 얻으려면 어떻게 해야합니까?

Fetch API를 사용 중이며 설명서에서 명확하지 않은 것으로 보입니다.

본문이로 반환되고 있으며이 ReadableStream스트림 내의 속성에 간단히 액세스하고 싶습니다. 브라우저 개발 도구의 응답 에서이 정보가 JavaScript 객체의 형태로 속성으로 구성되어있는 것으로 보입니다.

fetch('http://192.168.5.6:2000/api/car', obj)
    .then((res) => {
        if(res.status == 200) {
            console.log("Success :" + res.statusText);   //works just fine
        }
        else if(res.status == 400) {
            console.log(JSON.stringify(res.body.json());  //res.body is undefined.
        }

        return res.json();
    })


2
@FrancescoPezzella 답변 주셔서 감사합니다. 시도 response.Body.json()했지만 기울임 꼴 TypeError : undefined italic 의 'json'속성을 읽을 수 없습니다 . bodyUsed 속성도 false로 설정 되었기 때문입니까? 그러나 브라우저 개발자 도구의 응답 탭에서이 본문을 볼 수 있습니다. 검색하려는 오류 메시지가 있습니다.
멍청한 놈

문제가 순전히 오류 400 조건과 관련이 있습니까? 처리기를로 변경하면 어떻게됩니까 console.log(res.json());? 기대하는 데이터가 보입니까?
Ashley 'CptLemming'Wilson

@noob 만약에 응답을 스트림으로 읽으려고 res.status == 200합니까?
guest271314

그냥 내가 나 문서가 있다는 것이다 일반 잘못? 그래도이 답변에 대한 해결책으로 고쳤습니다.
Lucio

답변:


177

의 데이터에 액세스하려면 ReadableStream변환 방법 중 하나를 호출해야합니다 ( 여기에서 사용 가능한 문서 ).

예로서:

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(function(response) {
    // The response is a Response instance.
    // You parse the data into a useable format using `.json()`
    return response.json();
  }).then(function(data) {
    // `data` is the parsed version of the JSON returned from the above endpoint.
    console.log(data);  // { "userId": 1, "id": 1, "title": "...", "body": "..." }
  });

편집 : 데이터 반환 유형이 JSON이 아니거나 JSON을 원하지 않는 경우text()

예로서:

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(function(response) {
    return response.text();
  }).then(function(data) {
    console.log(data); // this will be a string
  });

이것이 문제를 해결하는 데 도움이되기를 바랍니다.


1
답변 주셔서 감사합니다. 나는 이것을 시도했지만 res.body가 정의되지 않은 곳에서 여전히 같은 오류가 발생합니다. 그러나 res.status를 사용하여 먼저 then () 함수에서 상태를 검색 할 수 있습니다. 본문 만 ReadableStream 객체 인 것 같습니다. 속성이 잠겨있는 것 같습니다. true로 설정되어 있습니까?
멍청한 놈

어디에서 액세스하려고 res.body합니까 (이것은 내 예제의 일부가 아닙니다)? 원래 질문에 샘플 코드를 공유하여 문제의 위치를 ​​더 명확하게 할 수 있습니까?
애슐리 'CptLemming'윌슨

1
첫 번째 .then () 함수에서 반환 된 json 응답에서 res.body에 액세스하려고했습니다. 더 명확하게하기 위해 원래 질문에 샘플을 추가했습니다. 감사!
멍청한 놈

1
반응과 요청 네이티브를 사용하여 전 세계에서 ReadableStream과 어떤 관계가 있는지 궁금해하는 것은 놀라운 일입니다. ++
edencorbin

헤드 업만으로도 생각할 필요는 없지만 타격을 줄 백엔드가 실제로 유효한 JSON을 제공하는지 확인하십시오! 분명히 경험에서 말하지 않습니다.
abelito

44

어떤 사람들은 async유용한 예를 찾을 수 있습니다 .

var response = await fetch("https://httpbin.org/ip");
var body = await response.json(); // .json() is asynchronous and therefore must be awaited

json()응답의 본문을 a ReadableStream에서 json 객체 로 변환 합니다.

await문은에 싸여해야 async하지만 당신은 실행할 수 있습니다, 기능 await(버전 62로) 크롬의 콘솔에서 직접 문을.


1
때때로 당신을위한 진짜 대답은 정말 # 2 하하, 그것은 그들이 비동기) (.json 할 것 왜 의미가 있지만 즉시 명백하지 않았다
Sanchit 바 트라

29

res.json()약속을 돌려줍니다. 시도해보십시오 ...

res.json().then(body => console.log(body));

3
나는 이것을 시도했고, 그것은 몸 대신 약속을 인쇄했다.
reectrix

체인하려고 .then전화 :fetch(...).then(res => res.json()).then(data => console.log(data))
오스카 고메즈 Alcañiz에게

12

파티에 조금 늦었지만 ReadableStreamSharepoint Framework를 사용하여 Odata $ batch 요청에서 생성 된 유용한 정보를 얻는 데 문제가있었습니다 .

OP와 비슷한 문제가 있었지만 필자의 경우 해결책은과 다른 변환 방법을 사용하는 것이 었습니다 .json(). 제 경우 .text()에는 매력처럼 일했습니다. 그러나 텍스트 파일에서 유용한 JSON을 얻으려면 약간의 조정이 필요했습니다.


2
감사합니다! 이것은 나를 위해 일했습니다. 간단한 라 라벨 서버에서 Illuminate http 응답을 보내고 return $data;있습니다. 나는 마침내 브라우저에서이 응답을 읽을 수있었습니다fetch(...).then(response => response.text()).then(data => console.log(data));
Cameron Hudson

10

그냥 텍스트로 응답을 원하는 경우에, JSON으로 변환 할 사용하지 https://developer.mozilla.org/en-US/docs/Web/API/Body/text를 하고 then그것은 실제를 얻을 수 약속의 결과 :

fetch('city-market.md')
  .then(function(response) {
    response.text().then((s) => console.log(s));
  });

또는

fetch('city-market.md')
  .then(function(response) {
    return response.text();
  })
  .then(function(myText) {
    console.log(myText);
  });

2

나는 체인 연결을 싫어합니다. 두 번째는 상태에 액세스 할 수 없습니다. 앞서 언급 한 것처럼 'response.json ()'은 약속을 반환합니다. 그런 다음 'response.json ()'의 결과를 반환하는 것은 초와 비슷합니다. 응답 범위 내에 추가 보너스가 있습니다.

return fetch(url, params).then(response => {
    return response.json().then(body => {
        if (response.status === 200) {
            return body
        } else {
            throw body
        }
    })
})

연결 then은 최종 해결 값 ( body) 을 검색하는 데 도움이됩니다 . 그것들을 중첩 시키면 body콜백이나 정렬 메커니즘없이 값 을 얻을 수 없습니다. 이것을 상상해보십시오 let body = await fetch(...).then(res => res.json()).then(data => data). 이것은 중첩 된 방식으로 작동하지 않습니다. 확인하려면 response.status항상 throw첫 번째 내부에서 예외 를 수행하고 전체 약속 체인에 thena catch를 추가하십시오 .
Óscar Gómez Alcañiz

0

스트림을 한 번만 읽을 수 있으므로 반복해서 읽으려면 응답을 복제해야 할 수도 있습니다.

fetch('example.json')
  .then(res=>res.clone().json())
  .then( json => console.log(json))

fetch('url_that_returns_text')
  .then(res=>res.clone().text())
  .then( text => console.log(text))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.