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

Insert video info to database through the API

我有自己的 Youtube 视频数据库。到目前为止它包含的是这些特定视频的id;也可以在视频中找到 link。

我正在寻找一种方法,可以使用 Youtube API 和 MySQL.[=18 将它们的标题和描述插入到数据库中=]

通过使用 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.) 要让它工作,request 中还需要另一个 connection.query,但由于它也是异步工作的,所以我对结果不太确定。将该响应的元素写入数据库的正确方法是什么?我应该使用另一种方法吗?在 'SELECT id FROM videos' 中编写整个逻辑是不是一个坏主意?

2.) 我尝试了 API links 并且它们在浏览器中工作,但是当代码本身运行时,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. 确保您的查询安全:将 "ORDER BY id DESC LIMIT 10" 添加到您的查询中。否则它会从 table.

  2. 中读取所有记录
  3. 您在 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();
        });
    };
});