একটি পঠনযোগ্য স্ট্রিম অবজেক্ট থেকে ডেটা পুনরুদ্ধার করবেন?


135

কীভাবে আমি কোনও ReadableStreamবস্তু থেকে তথ্য পেতে পারি ?

আমি ফেচ এপিআই ব্যবহার করছি এবং ডকুমেন্টেশন থেকে এটি পরিষ্কার হতে দেখছি না।

দেহটিকে একটি হিসাবে ফিরিয়ে দেওয়া হচ্ছে ReadableStreamএবং আমি কেবল এই স্ট্রিমের মধ্যে কোনও সম্পত্তি অ্যাক্সেস করতে চাই। ব্রাউজার ডেভ সরঞ্জামগুলিতে রেসপন্সের অধীনে, আমি জাভাস্ক্রিপ্ট অবজেক্টের আকারে, এই তথ্যটি বৈশিষ্ট্যগুলিতে সংগঠিত বলে মনে করি।

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
@ ফ্রেঞ্চসোপেজেলা সাড়া দেওয়ার জন্য ধন্যবাদ। আমি চেষ্টা করেছি response.Body.json(), কিন্তু আমি পাচ্ছি ইটালিক TypeError: সম্পত্তি অনির্ধারিত 'JSON' পড়তে পারছেন না ইটালিক । এটি কি কারণ দেহযুক্ত সম্পত্তিটিও মিথ্যা হিসাবে সেট করা আছে? তবে আমি ব্রাউজার বিকাশকারী সরঞ্জামগুলিতে প্রতিক্রিয়া ট্যাবের অধীনে এই বডিটি দেখতে পাচ্ছি। একটি ত্রুটি বার্তা রয়েছে যা আমি পুনরুদ্ধার করতে চাই।
নুব

সুতরাং আপনার সমস্যাটি সম্পূর্ণরূপে ত্রুটি 400 শর্তের সাথে সম্পর্কিত? আপনি যদি হ্যান্ডলারটি পরিবর্তন করেন তবে কী হবে console.log(res.json());? আপনি যে ডেটা আশা করছেন তা কি আপনি দেখতে পাচ্ছেন?
অ্যাশলে 'সিপেটলেমিং' উইলসন

@ নূব আপনি কি প্রতিক্রিয়াটিকে স্ট্রিম হিসাবে পড়ার চেষ্টা করছেন res.status == 200?
অতিথি 271314

এটা শুধু আমার বা যে ডকুমেন্টেশন হয় না প্লেইন ভুল? যদিও আমি এই উত্তরগুলির সমাধান দিয়ে এটি ঠিক করেছি।
লুসিও 19

উত্তর:


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
উত্তরের জন্য ধন্যবাদ. আমি এটি চেষ্টা করেছি এবং এখনও একই ত্রুটিটি পাচ্ছি যেখানে রেস.বডি অপরিজ্ঞাত। আমি স্থিতি পুনরুদ্ধার করতে সক্ষম হব তবে প্রথমে () ফাংশনে রেস.স্ট্যাটাস সহ। দেখে মনে হচ্ছে যে কেবল শরীরই একটি পঠনযোগ্য স্ট্রিম অবজেক্ট। মনে হচ্ছে কোনও সম্পত্তি তালাবদ্ধ আছে, যা সত্য হিসাবে সেট করা আছে?
noob

আপনি কোথায় অ্যাক্সেস করার চেষ্টা করছেন res.body(এটি আমার উদাহরণের অংশ নয়)? আপনার সমস্যাটি যেখানে হতে পারে তা আরও পরিষ্কার করার জন্য আপনি কি আপনার মূল প্রশ্নে কিছু নমুনা কোড ভাগ করতে পারেন।
অ্যাশলে 'সিপেটলেমিং' উইলসন

1
আমি .S () ফাংশনে প্রথমে ফিরে আসা জসন প্রতিক্রিয়া থেকে রেস.কে সবার কাছে অ্যাক্সেস করার চেষ্টা করেছি। আমি আরও স্পষ্টতার জন্য আমার মূল প্রশ্নের সাথে একটি নমুনা যুক্ত করেছি। ধন্যবাদ!
নুব

1
অসাধারণ, প্রতিক্রিয়া ব্যবহার এবং দেশীয় অনুরোধ করে এবং একটি পঠনযোগ্য স্ট্রিমের সাথে বিশ্বে কী করা উচিত তা ভাবছেন এবং এটি কৌশলটি করেছে। ++
এডেনকর্বিন

কেবলমাত্র একটি শীর্ষস্থানীয়, কোনও মস্তিষ্কের মত মনে হচ্ছে তবে নিশ্চিত হয়ে নিন যে আপনি যে ব্যাকএন্ডটি মারছেন তা আসলে বৈধ JSON সরবরাহ করছে! অবশ্যই অভিজ্ঞতা থেকে কথা না।
অ্যাবেলিতো

44

কিছু লোক asyncদরকারী উদাহরণ খুঁজে পেতে পারে :

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

json()প্রতিক্রিয়াটির শরীরকে একটি ReadableStreamথেকে একটি জসন বস্তুতে রূপান্তর করে ।

awaitবিবৃতি একটি আবৃত করা আবশ্যক asyncকিন্তু আপনি চালাতে পারেন, ফাংশন await(সংস্করণ 62 এর হিসাবে) Chrome- এর কনসোলে সরাসরি বিবৃতি।


1
কখনও কখনও আপনার জন্য আসল উত্তরটি আসলে # 2 হা হা, এটি কেন বোঝায় যে তারা কেন জ্যাসন () অবিচ্ছিন্ন করে
তুলবেন

29

res.json()প্রতিশ্রুতি ফিরিয়ে দেয় চেষ্টা করুন ...

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

3
আমি এটি চেষ্টা করেছিলাম, এবং এটি শরীরের পরিবর্তে প্রতিশ্রুতি ছাপিয়েছিল।
রেকট্রিক্স

.thenকলগুলিকে শৃঙ্খলাবদ্ধ করে দেখার চেষ্টা করুন :fetch(...).then(res => res.json()).then(data => console.log(data))
অস্কার গমেজ আলকায়েজ

12

পার্টিতে কিছুটা দেরি হলেও ReadableStreamওডাটা $ ব্যাচের অনুরোধটি শেয়ারপয়েন্ট ফ্রেমওয়ার্ক ব্যবহার করে কোনও প্রোডাক্ট থেকে দরকারী কিছু পাওয়ার ক্ষেত্রে কিছুটা সমস্যা ছিল ।

ওপি হিসাবে একই সমস্যা ছিল, তবে আমার ক্ষেত্রে সমাধানটি ছিল এর চেয়ে আলাদা রূপান্তর পদ্ধতি ব্যবহার করা .json()। আমার ক্ষেত্রে .text()একটি কবজ মত কাজ। পাঠ্য ফাইল থেকে কিছু দরকারী JSON পাওয়ার জন্য কিছু ফিডলিংয়ের প্রয়োজনীয় ছিল।


2
ধন্যবাদ! এটি আমার পক্ষে কাজ করেছে। আমি আমার লারাভেল সার্ভার থেকে একটি সরল সাথে একটি আলোকিত পোস্টের প্রতিক্রিয়া প্রেরণ করছি return $data;। অবশেষে আমি এই প্রতিক্রিয়াটি ব্রাউজারে পড়তে পেরেছিলামfetch(...).then(response => response.text()).then(data => console.log(data));
ক্যামেরন হডসন

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

আমি শৃঙ্খলা তত্সহ অপছন্দ করি। দ্বিতীয়টির স্থিতিতে অ্যাক্সেস নেই। যেমন আগে বলা হয়েছে 'রেসপন্স.জসন ()' প্রতিশ্রুতি দেয় তত্ক্ষণাত্ 'সেকেন্ড'-এর অনুরূপ ক্রিয়াকলাপগুলিতে' প্রতিক্রিয়া.জসন () 'এর তত্ক্ষণাত্ন ফলাফল result এটিতে প্রতিক্রিয়ার সুযোগ হওয়ার অতিরিক্ত বোনাস রয়েছে।

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প্রথমটির ভিতরে একটি ব্যতিক্রম হতে পারে এবং পুরো প্রতিশ্রুতি শৃঙ্খলে thenএকটি যুক্ত catchকরতে পারেন।
অস্কার গমেজ আলকায়েজ

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.