2016-04-22 10 views
0

Ich versuche, die erste Top-Track-Vorschau-URL von einem Künstler zu bekommen, aber jedes Mal, wenn ich die Suche mache, gibt es einen gebrochenen JSON zurück. Ich kann es als String analysieren, um zu bekommen, was ich brauche, aber ein JSON wäre viel einfacher. Hier ist mein Code:Spotify API Top-Tracks gebrochen

const https = require('https'); 
var open = require('open') 

function songError(){ 
    console.log('There was some kind of error fetching your artist ;('); 
} 

function getTopSong(p_id){ 
    https.get('https://api.spotify.com/v1/artists/'+p_id+'/top-tracks?country=BR', function(res){ 
     res.on("data", function(chunk){ 
      var json = JSON.parse(chunk.toString('utf8')); 
      console.log(json); 
     }); 
    }); 
} 

function getArtistID(p_name) { 
    https.get('https://api.spotify.com/v1/search?q='+encodeURI(p_name)+'&type=artist', function(res){ 
     res.on("data", function(chunk) { 
      var json = JSON.parse(chunk.toString('utf8')); 
      if(json['artists']['items'][0]['id'] != undefined || json['artists']['items'][0]['id'] != null){ 
       console.log('id: ',json['artists']['items'][0]['id']); 
       getTopSong(json['artists']['items'][0]['id']); 
      }else 
      { 
       songError(); 
      } 
     }); 
    }); 
} 

getArtistID("rage against the machine"); 

Es scheint in Zeile ein Fehler zu sein, 329:

undefined:329 
    "available_markets" : [ "AR", "AU", "AT", "BE", "BO", "BR", "BG", "CA", "CL", "CO", "CR", "CY", "CZ", "DK", "DO", "DE", "EC", "EE", "SV", "FI", "FR", "GR", " 

Meine Frage ist, bin ich etwas falsch oder ist es wirklich kaputt? Danke!

Antwort

0

Ich konnte es kräuseln ohne Probleme zumindest:

$ curl -s 'https://api.spotify.com/v1/artists/2d0hyoQ5ynDBnkvAbJKORj/top-tracks?country=BR' | python -mjson.tool | tail 
      "id": "25CbtOzU8Pn17SAaXFjIR3", 
      "name": "Take The Power Back - Remastered", 
      "popularity": 58, 
      "preview_url": "https://p.scdn.co/mp3-preview/b44e8f96a219871587d0559970ca5dce71c891f2", 
      "track_number": 3, 
      "type": "track", 
      "uri": "spotify:track:25CbtOzU8Pn17SAaXFjIR3" 
     } 
    ] 
} 

Ich weiß nicht viel über NodeJS, aber Sie brauchen nicht alle Rückrufe verketten res.on („data“

?

https://nodejs.org/api/http.html#http_http_request_options_callback

https.get('https://api.spotify.com/v1/artists/' + p_id + '/top-tracks?country=BR', function(res) { 
    var body = []; 
    res.on("data", function(chunk) { 
    body.push(chunk); 
    }); 
    res.on("end", function() { 
    var json = JSON.parse(Buffer.concat(body).toString("utf8")); 
    console.log(json); 
    }); 
}); 

Wenn die Antwort ist lang und Spotify-Servern entscheidet die Antwort zurück segmentierte Übertragungscodierung zu senden, dann ist das NodeJS http-Modul teilt sich wahrscheinlich die res ponse auch.

+0

Das ist es, ich habe vergessen, alles zu verketten, dummer Fehler! Danke! –

+0

Und ich habe gerade festgestellt, dass es wahrscheinlich nichts mit der chunked Transfer-Codierung vom Server zu tun hat. Die API wird den Körper wahrscheinlich in Blöcke teilen, so dass Sie Gigabytes herunterladen können, ohne alles im Speicher ablesen zu müssen. – jooon