You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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,提问作者Артем Мишуровский

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 09:50:26