通过 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 }
这个问题的根源是什么? (如果单独成为另一个问题是可行的,我愿意从原始问题中删除,因为这不是原始问题的一部分)
确保您的查询安全:将 "ORDER BY id DESC LIMIT 10" 添加到您的查询中。否则它会从 table.
中读取所有记录
您在 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();
});
};
});
我有自己的 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 }
这个问题的根源是什么? (如果单独成为另一个问题是可行的,我愿意从原始问题中删除,因为这不是原始问题的一部分)
确保您的查询安全:将 "ORDER BY id DESC LIMIT 10" 添加到您的查询中。否则它会从 table.
中读取所有记录
您在 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();
});
};
});