我坚持使用NodeJS将JSON数据插入MySQL数据库。 我收到了这个错误:
错误:ER_PARSE_ERROR:您的SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在''{{\“id \”:\“d3f3d \”,\“code \”:\“'第1行附近使用正确的语法
我使用url.json
节点模块从request
获取JSON数据,我正在尝试将数据存储在MySQL数据库中。
//mysql connection setup
var connection = mysql.createConnection({
host : "localhost",
port: "3306",
user : "root",
password : "root",
database : "db",
multipleStatements: true
});
request('url.json', function (error, response, body) {
if (!error && response.statusCode == 200) {
//console.log(body)
}
var sql = "INSERT INTO table (id, code, country_name, city) VALUES ?";
var data = JSON.parse(body);
var responseJson = JSON.stringify(data.response.docs);
var query = connection.query(sql, [responseJson], function(err, result) {
if(err) throw err;
console.log('data inserted');
});
console.log(query.sql);
});
数据记录为'' '[{\"id\":\"d3f3d\",\"code\":\"'... }]'
。我认为这可能是错误的根源。
JSON结构如下所示:
{
"header":
{
"file1":0,
"file2":1,
"subfiles":{
"subfile1":"true",
"subfile2":"true",
}
},
"response":
{
"number":678,
"start":0,
"docs":[
{
"id":"d3f3d",
"code":"l876s",
"country_name":"United States",
"city":"LA"
},
{
"id":"d2f2d",
"code":"2343g",
"country_name":"UK",
"city":"London"
}
]
}
}
如何解决此问题?
感谢。
答案 0 :(得分:3)
错误源于query
对象尝试解析提供的值。该函数要求values数组包含多个数组,但接收的是字符串。 responseJson
无需转换为JSON字符串。
您需要将对象数组转换为仅包含值的数组数组。例如,查询需要这种形式的数组:
"docs":[
[
"d3f3d",
"l876s",
"United States",
"LA"
],
[
"d2f2d",
"2343g",
"UK",
"London"
]
]
这是一种将对象数组转换为值数组的方法:
function ObjToArray(obj) {
var arr = obj instanceof Array;
return (arr ? obj : Object.keys(obj)).map(function(i) {
var val = arr ? i : obj[i];
if(typeof val === 'object')
return ObjToArray(val);
else
return val;
});
}
这是重构的代码:
var data = JSON.parse(body);
// Convert the array of objects into an array of arrays.
var responseJson = ObjToArray(data.response.docs);
// The query object expects an array of objects so you pass in 'responseJson' as is
var query = connection.query(sql, responseJson, function(err, result) {
if(err) throw err;
console.log('data inserted');
});
此issue解释了node-mysql
的批量插入问题。
答案 1 :(得分:3)
您有潜在的安全问题。通过让data.response.docs包含MySQL命令,切割人员可以从您的表中窃取数据。替换
var sql = "INSERT INTO table (id, code, country_name, city) VALUES ?";
带
var sql = "INSERT INTO table (id, code, country_name, city) VALUES (? ? ? ?)";
然后替换
var query = connection.query(sql, [responseJson], function(err, result)
带
var query = connection.query(sql, [var1, var2, var3, var4], function(err, result)
从你的行为看起来并不是什么大不了的事,但对你来说可能是一个巨大的交易。