2016-04-01 19 views
1

Kendi Youtube videoları veritabanım var. Şimdiye kadar içerdiği şey bu belirli videoların kimliğidir; video bağlantısında da bulunabilecek olanı.Video bilgilerini veritabanına API aracılığıyla ekleyin

Youtube API'sı ve MySQL kullanımıyla hem başlığın hem de bunların açıklamasını veritabanına eklemek için kullanabileceğim bir yöntem arıyorum.

the mysql npm kullanımıyla, veritabanına bağlanabiliyordum, ancak async doğası beni biraz karıştırıyor. bu da uyumsuz çalıştığı için

1.) o request içinde, başka connection.query gerekli olacağını geçerli olmasını sağlamak için ancak:

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); 
      }; 
     }); 
    }; 
}); 

Sorular:

İşte benim orijinal (tamamlanmamış) kod Sonuçtan emin değilim. Bu cevabın öğelerini veritabanına yazmanın doğru yolu nedir? Başka bir çeşit hizmet kullanmalı mıyım? Bütün mantığın 'SELECT id FROM videos' içinde yazılması kötü bir fikir miydi?

2.) API bağlantıları çalıştı ve tarayıcıda çalıştı, ama kod kendisi çalıştırıldığında, request aşağıdaki mesajın oluştuğu, atar ve hata:

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

Bunun kaynağı nedir sorun? add "SİPARİŞ:

cevap

2
  1. Sorgunuzda kasa olun (kendi kendine başka bir soru olmak yaşayabilir eğer bu orijinal konunun kısmının daha az olduğu için, ben, orijinal soruya kaldırmak için hazırım) Sorunuz için "DESC LIMIT 10" yazısı ile. Aksi takdirde tablodaki tüm kayıtları okur.

  2. For döngüsünün içinde çok fazla istek gönderiyorsunuz, bu nedenle birinin bitmesini beklemeden istekleri (arabellek hatası yok) için bellek harcıyorsunuz.

    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(); 
        }); 
    }); 
    

    VEYA Sen döngü kayıtların hepsi ısrar ederlerse:

Daha iyi böyle yapmak için

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

O, teşekkürler yardımcı oldu ve çalıştı! –