parse fetch () JSON ответный вывод Nodejs против parse JSON переменная - PullRequest
0 голосов
/ 16 апреля 2020

У меня довольно интересный вопрос, и я надеюсь, что кто-нибудь мне поможет. Я надеялся, что кто-нибудь сможет объяснить мне разницу между анализом объекта Variable JSON и анализом данных ответа fetch () JSON объекта, который помещается в переменную. Например:

Если у меня есть переменная вроде:

var myJSON = 
{
  "items" : [ {
    "id" : "T0lDX0J1aWxkX0FydGlmYWN0czpmODk4YjM5MDNjYjk5YzU5NjgzNTk3ZWRjNWFmZjliYw",
    "repository" : "Build_Artifacts",
    "format" : "raw",
    "group" : "/",
    "name" : "05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip",
    "version" : null,
    "assets" : [ {
      "downloadUrl" : "http://localhost:8081/repository/Build_Artifacts/05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip",
      "path" : "05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip",
      "id" : "T0lDX0J1aWxkX0FydGlmYWN0czphNDc1N2JjYWE2MmI2MzA2MDdlMTA1NGE4NTk1MDQ1OQ",
      "repository" : "Build_Artifacts",
      "format" : "raw",
      "checksum" : {
        "sha1" : "040e517528c05ca335a38e98c7ab8673773314bd",
        "sha512" : "652e624873da778dce4bc417cacfead12bdd2ad01e9f7f77cba80270caa0f99caa09d4fb53f584a4da9991186f78bd7b55da1e4ed3f22e026b8333dd332b3b83",
        "sha256" : "b66805d15702505f708b90f6e1169c79390d59b9f8cadc9ab1852f48eeabbfe2",
        "md5" : "60fdd406e026330c2cfbec3e15e05414"
      }
    } ]
  }]
}

, тогда я могу проанализировать ее с помощью:

console.log(myJSON.items[0].name)
// Output is as follows:
// 05baf31c20d15edb2c477fa4e7bd2427504d3dba_DATE_2020-04-10_TIME_11_09_36.zip

Однако, если я получу точно такую ​​же JSON из fetch и поместите его в переменную следующим образом:

const fetch = require("node-fetch");
const asset = 'Build_Artifacts'
const url2 = 'http://localhost:8081/service/rest/v1/components?repository='
const myHeaders = {
    "Authorization": "Basic token",
    "Content-Type": "application/json",
};

const requestOptions = {
    method: 'GET',
    headers: myHeaders,
    redirect: 'follow'
}


const getData = async () => {
    const res = await fetch(url2 + asset, requestOptions);
    const myJSON = await res.json()
    //console.log(myJSON)
    return myJSON
}
getData().then(res = (myJSON) => {
    console.log(myJSON.items[0].name)

})

// Output is as follows:
// UnhandledPromiseRejectionWarning: TypeError: Cannot read property '0' of undefined

Я понимаю, что fetch () является асин c, и поэтому он возвращает ответ в форме обещания. Я также прочитал ответные данные в виде потока. Может ли кто-нибудь подтвердить, что вывод моей выборки не определен, потому что я пытаюсь проанализировать данные потока? Если это так, то может ли кто-нибудь помочь с небольшим примером того, как я могу получить данные и проанализировать их, чтобы получить только те данные, которые я хочу просмотреть?

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Похоже, работает следующее:

const getData = async () => {
    const res = await fetch(url2 + asset, requestOptions);
    const myJSON = await res.text()
    return myJSON
}

getData().then(function (result) {
    const resultArr = [];
    const outObjA = JSON.parse(result);
        for (let i=0; i < outObjA.items.length; i++) {
            const fileName = outObjA.items[i].name
            resultArr.push(fileName)
        }
    console.log(resultArr)
    }).catch(error => {
        console.log('Error:', error)
  })

Параметр for l oop позволяет мне перебирать весь ответ JSON для всех items.name и выгружать их в массив resultArr.

0 голосов
/ 16 апреля 2020

вы можете изменить мою переменную Json, отформатировав ее так:

var myJson = [{items: {...}}]
...