2016-04-01 10 views
1

私はYoutubeビデオのデータベースを持っています。これまでに含まれているのは、これらの特定の動画のIDです。ビデオリンクでも見つかるものがあります。API経由でビデオ情報をデータベースに挿入

私はYoutube APIとMySQLを使用して、タイトルと説明をデータベースに挿入するための方法を探しています。

the mysql npmを使用すると、データベースに接続できましたが、非同期の性質が少し混乱します。

ここに私の元の(不完全な)コードです:

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

質問:

1)それを動作させるためには、別のconnection.queryrequest以内に必要であろうが、それはまた、非同期で動作しますので、私は結果については確信しています。その応答の要素をデータベースに書き込む適切な方法は何ですか?私は別の種類のapporachを使うべきですか? 'SELECT id FROM videos'の全体ロジックを書くことは悪い考えでしたか?

2)私はAPIのリンクを試してみましたが、彼らは、ブラウザで働いていますが、コード自体の実行時に、requestをスローし、次のメッセージで構成され、エラー、この源は何

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

問題? (独自に別の質問であることを実行可能かどうこれは、元の問題の一部の小さいとして、私は、元の質問から削除して喜んだ)

答えて

2
  1. はあなたのクエリを安全に:「ORDERを追加BY id DESC LIMIT 10 "を入力してください。そうでなければ、テーブルからすべてのレコードを読み込みます。

  2. forループ内でリクエストが多すぎるので、リクエストが完了するのを待たずにリクエスト(バッファエラーなし)のメモリを無駄にしています。

このようにそれを行うには良い:

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

たり、ループに主張すれば、レコードのすべて:

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

それは助けと働いていた、ありがとう! –

関連する問題