2017-12-09 15 views
0

Webから取得したjsonを解析し(https://api.coinmarketcap.com/v1/ticker/?limit=3)、名前とprice_usdを選択できるようにしようとしています。参考のために:Nodejs - Webから取得したjsonを解析します。

var url = 'https://api.coinmarketcap.com/v1/ticker/?limit=3'; 
var dataResponse = ''; 
var body = ''; 

function retrieveData() { 
    https.get(url, function(res){ 
     body = ''; 

     res.on('data', function(chunk) { 
      body += chunk; 
     }); 

     res.on('end', function() { 
      dataResponse = JSON.parse(body); 
     }); 


    }).on('error', function(e) { 
      console.log("Error: ", e); 
    }); 

} 

retrieveData(); 

var temp = (dataResponse[0]); 

console.log(temp); 

私のようなものを取得し、名前と価格を選択できるようにすることができるようにしたい:

 "id": "bitcoin", 
     "name": "Bitcoin", 
     "symbol": "BTC", 
     "rank": "1", 
     "price_usd": "16148.3", 
     "price_btc": "1.0", 
     "24h_volume_usd": "18799600000.0", 
     "market_cap_usd": "270147332945", 
     "available_supply": "16729150.0", 
     "total_supply": "16729150.0", 
     "max_supply": "21000000.0", 
     "percent_change_1h": "-0.28", 
     "percent_change_24h": "-4.64", 
     "percent_change_7d": "45.79", 
     "last_updated": "1512792553" 

[ 
{ 
    "id": "bitcoin", 
    "name": "Bitcoin", 
    "symbol": "BTC", 
    "rank": "1", 
    "price_usd": "16148.3", 
    "price_btc": "1.0", 
    "24h_volume_usd": "18799600000.0", 
    "market_cap_usd": "270147332945", 
    "available_supply": "16729150.0", 
    "total_supply": "16729150.0", 
    "max_supply": "21000000.0", 
    "percent_change_1h": "-0.28", 
    "percent_change_24h": "-4.64", 
    "percent_change_7d": "45.79", 
    "last_updated": "1512792553" 
}, 
{ 
    "id": "ethereum", 
    "name": "Ethereum", 
    "symbol": "ETH", 
    "rank": "2", 
    "price_usd": "471.833", 
    "price_btc": "0.0296001", 
    "24h_volume_usd": "2170950000.0", 
    "market_cap_usd": "45401368016.0", 
    "available_supply": "96223384.0", 
    "total_supply": "96223384.0", 
    "max_supply": null, 
    "percent_change_1h": "0.01", 
    "percent_change_24h": "9.29", 
    "percent_change_7d": "0.65", 
    "last_updated": "1512792556" 
}, 
{ 
    "id": "bitcoin-cash", 
    "name": "Bitcoin Cash", 
    "symbol": "BCH", 
    "rank": "3", 
    "price_usd": "1510.48", 
    "price_btc": "0.094759", 
    "24h_volume_usd": "2229320000.0", 
    "market_cap_usd": "25444318815.0", 
    "available_supply": "16845188.0", 
    "total_supply": "16845188.0", 
    "max_supply": "21000000.0", 
    "percent_change_1h": "0.6", 
    "percent_change_24h": "1.29", 
    "percent_change_7d": "2.64", 
    "last_updated": "1512792581" 
    } 
] 

ここで私が現在持っているコードです

エラーは、定義されていないログです。私は何が間違っているのか分かりません。名前をどうやって選ぶの?各ブロックを配列に分割し、それらをインデックスで選択しますか?

+2

'retrieveData'は非同期、' 'retrieveData'が終了する前にconsole.log'が実行され – Khang

+0

私が推薦する:これは、ように見えるだろう方法ですあなたはnode.jsでの約束と非同期/コーディングを待っています。これは通常、初心者のときに発生します。以下の答えはあなたのために働くでしょう。 –

答えて

0

:そこ非同期コードとどのようにここでそれを処理するための良い書き込みアップがあります.on.endのコールバックは、URLへのリクエストが完了した後に実行されることを覚えておく必要があります。

約束通りに関数をラップしてからアクセスするには、次のように.thenを使用します。

PROMISES非同期処理の詳細については、このリンクを参照してください。

function retrieveData() { 
    return new Promise((resolve, reject) => { 
    https.get(url, function(res){ 
     body = ''; 

     res.on('data', function(chunk) { 
      body += chunk; 
     }); 

     res.on('end', function() { 
      resolve(JSON.parse(body)); 
     }); 


    }).on('error', function(e) { 
     reject(e); 
    }); 
    }) 
} 

retrieveData().then(response => { 
    console.log(response[0]); 
}).catch(error => { 
    console.log(error) 
}) 
0

機能receiveDataが非同期であり、dataResponseアレイが設定される前にconsole.logが実際に実行されたという問題があります。あなたは、あなたの関数は、この

function retrieveData(callback) { 
    https.get(url, function(res){ 
     body = ''; 
     res.on('data', function(chunk) { 
      body += chunk; 
     }); 

     res.on('end', function() { 
      var dataResponse = JSON.parse(body); 
      callback(dataResponse,null); 
     }); 
    }).on('error', function(e) { 
      console.log("Error: ", e); 
      callback(null,e) 
     }); 
} 

同様にコールバックが次に、このようにそれを呼び出す受け入れる作るHow do I return the response from an asynchronous call?

1

retrieveData(function (dataResponse, err) { 
if (err) console.log(err); 
else { 
    var temp = (dataResponse[0]); 
    console.log(temp); 
} 
}); 
0

私はあなたがすでにそこにいると思うので、「dataResponse」をコンソールに記録するだけです。 "dataResponse"はオブジェクトの配列なので、簡単なjavascriptを使ってオブジェクトをコンソールに出力することができます。

`` `

var https = require ("https") 

var url = 'https://api.coinmarketcap.com/v1/ticker/?limit=3'; 

function retrieveData() { 
    https.get (url, function (res){ 
     body = ''; 

     res.on('data', function (chunk) { 
      body += chunk; 
     }); 

     res.on('end', function() { 
      dataResponse = JSON.parse (body); 
      console.log (dataResponse[0]) 
     }); 


    }).on ('error', function (e) { 
      console.log ("Error: ", e); 
    }); 

} 

retrieveData() 

` ``

関連する問題