通过API将video信息插入数据库

我有一个自己的Youtubevideo数据库。 它包含的内容到目前为止是这些特定video的ID; 也可以在video链接中find。

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

通过使用MySQL的NPM ,我可以连接到数据库,但asynchronous的性质使我困惑了一下。

这是我的原始(不完整)代码:

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 ,但是因为这也是asynchronous工作的,所以我对结果很不确定。 将该响应的元素写入数据库的正确方法是什么? 我应该使用另一种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. 确保您的查询安全:将“ORDER BY ID DESC LIMIT 10”添加到您的查询。 否则它读取表中的所有logging。

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

或者如果你坚持循环所有的logging:

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