通过API将视频信息插入数据库

时间:2016-04-01 17:18:08

标签: javascript mysql node.js database youtube-data-api

我有自己的Youtube视频数据库。到目前为止它包含的内容是这些视频的内容;也可以在视频链接中找到。

我正在寻找一种方法,可以通过使用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.query中需要另一个request,但由于这也是异步工作,我对结果非常不确定。将响应的元素写入数据库的正确方法是什么?我应该使用其他类型的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 }

这个问题的根源是什么? (如果它本身可以成为另一个问题,我愿意从原来的问题中删除,因为这不是原始问题的一部分)

1 个答案:

答案 0 :(得分:2)

  1. 确保您的查询安全:在您的查询中添加“ORDER BY id DESC LIMIT 10”。否则它会从表中读取所有记录。

  2. 你在for循环中发送的请求太多,所以你在浪费请求内存(没有缓冲区错误)而不等待一个完成。

  3. 最好这样做:

    Sub Reset_formula()
    Worksheets("Dagbok").Range("K6").Formula = "=IFERROR(IF(INDEX(Data!$C$3:$J$4;MATCH(Data!$O$4;Data!$B$3:$B$4;0);MATCH(Dagbok!K5;Data!$C$2:$J$2;0))=0;"""";INDEX(Data!$C$3:$J$4;MATCH(Data!$O$4;Data!$B$3:$B$4;0);MATCH(Dagbok!K5;Data!$C$2:$J$2;0)));"""")"
    End Sub
    

    如果您坚持循环所有记录,则为:

    {{1}}