我有自己的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 }
这个问题的根源是什么? (如果它本身可以成为另一个问题,我愿意从原来的问题中删除,因为这不是原始问题的一部分)
答案 0 :(得分:2)
确保您的查询安全:在您的查询中添加“ORDER BY id DESC LIMIT 10”。否则它会从表中读取所有记录。
你在for循环中发送的请求太多,所以你在浪费请求内存(没有缓冲区错误)而不等待一个完成。
最好这样做:
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}}