2016-04-01 3 views
1

Ich habe eine eigene Datenbank mit Youtube Videos. Was es bisher enthält, ist die ID dieser bestimmten Videos; der, der auch in der Videoverbindung zu finden ist.Videoinfo in die Datenbank über die API einfügen

Ich suche nach einer Methode, die ich benutze, um sowohl den Titel als auch die Beschreibung von ihnen in die Datenbank mit Hilfe der Youtube API und MySQL einzufügen.

Durch die Verwendung von the mysql npm konnte ich mit der Datenbank verbinden, aber die asynchrone Natur verwirrt mich ein wenig.

Hier ist mein ursprünglicher (unvollständig) Code:

var request = require('request'); 
var mysql  = require('mysql'); 

var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'root', 
    password : (this is secret) 
    database : 'video_db' 
}); 

connection.query('SELECT id FROM videos', function(err, rows, fields) { 
    if (err) throw err; 

    for(i=0;i<rows.length-1;i++){ 

     var APIkey = (this is also secret) 
     var videoid = rows[i].id; 

     //gets data of a single video 
     var API_URL = 'https://www.googleapis.com/youtube/v3/videos' 
      + '?part=snippet' 
      + '&id=' + videoid 
      + '&key=' + APIkey; 

     request(API_URL, function (error, response, body) { 
      if (!error && response.statusCode == 200) { 

       console.log(JSON.parse(body)); 
      } else { 
       console.log(error); 
      }; 
     }); 
    }; 
}); 

Fragen:

1.), damit es funktioniert, eine andere connection.query im request notwendig wäre, aber da das auch asynchron arbeitet Ich bin ziemlich unsicher über das Ergebnis. Was ist der richtige Weg, um Elemente dieser Antwort in die Datenbank zu schreiben? Soll ich eine andere Art von Übung verwenden? Ist es möglich, dass das Schreiben der gesamten Logik innerhalb 'SELECT id FROM videos' eine schlechte Idee war?

2.) habe ich versucht, die API-Verbindungen und sie im Browser gearbeitet, aber wenn der Code selbst läuft, request wirft und Fehler, die aus der folgenden Meldung besteht:

{ [Error: connect ENOBUFS 216.58.214.202:443 - Local (undefined:undefined)] 
    code: 'ENOBUFS', 
    errno: 'ENOBUFS', 
    syscall: 'connect', 
    address: '216.58.214.202', 
    port: 443 } 

Was die Quelle für diese ist Problem? (Wenn es rentabel ist eine andere Frage für sich allein zu sein, bin ich bereit, von der ursprünglichen Frage zu entfernen, da dies weniger der Teil der ursprünglichen Ausgabe ist)

Antwort

2
  1. Ihre Anfrage sicher machen: add „ORDER BY ID DESC LIMIT 10 "zu Ihrer Anfrage. Ansonsten liest es alle Datensätze aus der Tabelle.

  2. Sie senden zu viele Anfragen innerhalb der for-Schleife, so dass Sie Speicher für Anfragen verschwenden (kein Pufferfehler), ohne auf den Abschluss zu warten.

Besser es wie dies zu tun:

var request = require('request'); 
var mysql = require('mysql'); 
var async = require ('async'); 

var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'root', 
    password : 'this is secret', 
    database : 'video_db' 
}); 

var APIkey = "SECRET KEY"; 

var apiUrls = []; 
connection.query('SELECT id FROM videos ORDER id LIMIT 10', function(err, rows,) { 
    if (err) throw err; 

    rows.forEach(function(row){ 
     var API_URL = 'https://www.googleapis.com/youtube/v3/videos' 
      + '?part=snippet' 
      + '&id=' + row.id 
      + '&key=' + APIkey; 
     apiUrls.push(API_URL); 
    }; 
}); 

async.eachSeries(apiUrls, function(apiUrl, next){ 

    request(apiUrl, function (error, response, body) { 
     if(error || response.statusCode != 200) { 
      console.error(response.statusCode, error); 
      return next(); 
     } 

     console.log(JSON.parse(body)); 
     next(); 
    }); 
}); 

oder wenn Sie in einer Schleife bestehen alle Datensätze:

var request = require('request'); 
var mysql = require('mysql'); 
var async = require ('async'); 

var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'root', 
    password : 'this is secret', 
    database : 'video_db' 
}); 

var APIkey = "SECRET KEY"; 

connection.query('SELECT id FROM videos', function(err, rows) { 
    if (err) throw err; 

    async.eachSeries(rows, function(row, next){ 
     //gets data of a single video 
     var apiUrl = 'https://www.googleapis.com/youtube/v3/videos' 
      + '?part=snippet' 
      + '&id=' + row.id 
      + '&key=' + APIkey; 

     request(apiUrl, function (error, response, body) { 
      if(error || response.statusCode != 200) { 
       console.error(response.statusCode, error); 
       return next(); 
      } 

      console.log(JSON.parse(body)); 
      next(); 
     }); 
    }; 
}); 
+1

Es half und gearbeitet, danke! –