在升级到0.24.1后,本机提取返回Blob而不是JSON

时间:2016-04-24 07:23:44

标签: json react-native blob fetch

嗨所以我最近升级到了0.24.1而且我遇到了fetch的问题。我遇到的问题与https://github.com/facebook/react-native/issues/6025类似,但是body init正在返回Blob而不是JSON。我已经进行了更新,因此它现在使标题Accept & Content-Typeapplication/json一样,就像他们在上面的问题中所做的那样,但仍然没有运气。

return fetch(`${auth0_api}/userinfo`, {
  method: 'GET',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${access_token}`
  }

当我console.log得到回复时:

{
  _bodyBlob: Blob
    size: 1144
    type: "application/json; charset=utf-8"
  _bodyInit:Blob
    size: 1144
    type: "application/json; charset=utf-8"
  headers: Headers
  ok: true
  status: 200
  statusText: undefined
  type: "default"
  url: ""https://lite.au.auth0.com/userinfo""
}

7 个答案:

答案 0 :(得分:10)

在发布此问题之前,我可能应该阅读https://github.com/github/fetch ...

需要在回复中使用.json()

return fetch(`${auth0_api}/userinfo`, {
  method: 'GET',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${access_token}`
  }
})
.then((response) => {
  return response.json();
});

答案 1 :(得分:0)

在我的情况下,我使用的是交叉获取,它导致了json()问题:

import fetch from "cross-fetch";

删除它有助于我在之后转换为json。

答案 2 :(得分:0)

我返回了response.send(即使我尝试过 res.json(),res.text(),res.end,res.send(data),res.json(data ),返回数据,返回data.json(),res.end(data),res.send(JSON.stringify(data)),每种组合...)

就像下面的例子一样

    sendDashboardSigninUrl(req, res, next) {
        SecurityTokensService.sendDashboardSigninUrl(req)
            .then(data => {
                if(req.body.password == myPwd){
                    console.log("data:"+ JSON.stringify(data));
                    res.send(data); //code return from here with 200 ok
                }
                else
                {
                    console.log("error:");
                    throw new Exception("data Error");
                }               
            })
            .catch(next);
    }
}

每次这样的前端:

> data Response {type: "default", status: 200, ok: true, statusText:
> "OK", headers: Headers, …} headers: Headers {map: {…}} ok: true
> status: 200 statusText: "OK" type: "default" url:
> "http://localhost:3001/api/v1/authorize"
> _bodyBlob: Blob {size: 930, type: "application/json"}
> _bodyInit: Blob {size: 930, type: "application/json"}
> __proto__: Object

但是在进一步调查之后,我发现使用json()真的很有趣 通过此前端成功

Client.auth(settings.apiBaseUrl, this.state.email, this.state.password)
            .then(response => response.json()).then((data) => {
                var pureLink = data;
            })

答案 3 :(得分:0)

获取库已更新,现在是:

fetch('/users')
.then(function(res){
    res.json().then(function(data) {
       console.log('request succeeded with JSON response', data)
    }).catch(function(error) {
       console.log('Data failed', error)
    });
}).catch(function(error){
     console.log('request failed', error)
})

答案 4 :(得分:0)

.json返回一个promise,因此您可能需要在登录之前解决该问题:

fetch(`${auth0_api}/userinfo`, {
      method: 'GET'})
  .then((response) => response.json())
  .then(responseJSON => console.log('here you go:', responseJSON));
}

答案 5 :(得分:0)

除了 json() 的其他答案,然后它返回承诺, 我所做的不是将标题提供给 fetch。试试这个,我的问题在给 fetch 提供标头后解决了。

答案 6 :(得分:-2)

@ kurupt_89的答案有效,但从blob解析数据到json的成本超过1秒,我认为它不应该是这样的。在github上有一个问题描述这个问题,也许你可以添加一些细节。 https://github.com/facebook/react-native/issues/8941

好的,我已经改变了fetch.js的第419行(路径:node_modules / react-native / Libraries / Fetch / fetch.js),



if ('responseType' in xhr && support.blob)






if ('responseType' in xhr && xhr.responseType && support.blob)




然后可以轻松地将响应解析为Json