通过API将视频信息插入数据库
Insert video info to database through the API
我有自己的Youtube视频数据库。到目前为止,它包含的是这些特定视频的id;也可以在视频链接中找到。
我正在寻找一种方法,可以使用Youtube API和MySQL将它们的标题和描述插入数据库。
通过使用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链接,它们在浏览器中工作,但当代码本身运行时,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"。否则,它将从表中读取所有记录。
-
您在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();
});
};
});
相关文章:
- 使用formData使用ajax将图像插入数据库
- 如何访问日期并将其插入数据库?节点.JS&MongoDB
- 使用Mysqli、PHP和AJAX的聊天系统正在将空白消息插入数据库
- AJAX PHP 连接将行插入数据库
- 使用 pur Html 和 Javascript 将文件插入数据库
- 将表单数据插入数据库后无法重定向到 html 页面
- 将整数变量插入数据库
- 单击按钮可多次动态添加选择框、文本框和日期,并将这些值插入数据库
- 动态选择列表AJAX和插入数据库表通过张贴形式
- 无法使用ajax序列化功能将图像插入数据库
- 使用ajax进行内联编辑(将值插入数据库)
- 将捕获的图像插入数据库问题(Cordova/SQlite/JavaScript)
- 如何在 PHP 中将动态表值插入数据库
- 将数据插入数据库express/mongodb应用程序时出错
- 通过API将视频信息插入数据库
- 我想单击一个
- 并获取 id 以通过 POST 将其插入数据库,可以吗?
- 如何将翻译后的文本插入数据库 php
- PHP-插入数据库而不刷新页面(OOP)
- MongoDB在将文档插入数据库之前为空集合
- 将本地存储值插入数据库