从JSON API获取数据写入MySQL数据库失败,如何排查解决?
数据写入MySQL失败的问题排查与解决
问题背景
通过异步方法getUsers(url)从JSON API提取用户字段(id、name、username、email、address.city、phone)整理为二维数组后,尝试写入MySQL数据库失败,已知数据库本身可正常写入,values类型为object,query类型为string。
核心错误点
getUsers函数无返回值:函数内部仅打印了整理后的数组,但未通过return返回结果,导致await getUsers(url)得到的values为undefined,无法传递有效数据给数据库操作。- 批量插入SQL语法错误:当前SQL语句是单条数据插入格式,但
getUsers返回的是多条数据的二维数组,需使用MySQL批量插入的语法格式。 - 数据库查询参数格式错误:调用
db.query时将values包裹在数组[values]中,导致参数结构变成三维数组,与SQL占位符不匹配。
修正后的代码
const url = 'https://jsonplaceholder.typicode.com/users'; const mysql = require('mysql'); // 确保已引入mysql模块 const db = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'user_records' }); async function getUsers(url) { const response = await fetch(url); const result = await response.json(); return result.reduce((acc, item) => { const { id, name, username, email, address, phone } = item; acc.push([id, name, username, email, address.city, phone]); return acc; }, []); // 返回整理后的二维数组 } db.connect(async (err) => { if (err) { console.log('Error occurred..', err); return; } console.log('MySQL Connected...'); try { const values = await getUsers(url); if (!values || values.length === 0) { console.log('No data to insert'); return; } // 构建批量插入的SQL占位符 const placeholders = values.map(() => '(?, ?, ?, ?, ?, ?)').join(','); const query = `INSERT INTO user_records.users (id, name, username, email, city, phone) VALUES ${placeholders}`; // 扁平化参数数组,匹配所有占位符 const flatValues = values.flat(); db.query(query, flatValues, function (err, result) { if (err) { console.log(err); } else { console.log(`Insert to DB: ${result.affectedRows} rows affected`); } db.end(); // 操作完成后关闭连接 }); } catch (fetchErr) { console.log('Fetch data failed:', fetchErr); db.end(); } });
额外优化说明
- 补充了
mysql模块的引入提示(原代码缺失)。 - 新增
try/catch捕获API请求失败的异常。 - 增加空数据判断,避免无数据时执行无效插入。
- 操作完成后调用
db.end()关闭数据库连接,防止连接泄漏。
内容的提问来源于stack exchange,提问作者Артем Мишуровский
相关产品推荐
相关产品推荐

