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

如何将Mongoose实现的API数据入库代码适配为React+Node+MySQL?

问题描述

我原本用Mongoose写了一段代码,功能是从在线API获取数据并存入MongoDB。现在要适配到React+Node.js+MySQL技术栈,已经写了操作MySQL的初步代码,但不知道怎么把在线API的调用部分整合进去,求实现方案。

原Mongoose代码

import mongoose, { mongo } from 'mongoose';

mongoose.connect("mongodb://127.0.0.1:27017/highscore");

const postSchema = new mongoose.Schema({
    position: {
        type: Number,
        required: true
    },
    id: {
        type: Number,
        required: true
    },
    score: {
        type: Number,
        required: true
    },
});

const Post = mongoose.model('Players', postSchema);

async function getPosts() {
    const getPlayers = await fetch("http://localhost:3008/api/highscore/players");
    const response = await getPlayers.json();
    for( let i = 0;i < response.players.length; i++){
        const post = new Post({
            position: response.players[i]['position'],
            id: response.players[i]['id'],
            score: response.players[i]['score'],
        });
        post.save();
    }
}

现有Node.js+MySQL初步代码(缺失API整合)

app.post('/create', (req, res) => {
    const position = req.body.position
    const name = req.body.name
    const alliance = req.body.alliance
    const points = req.body.points

    db.query("INSERT INTO stats (position, name, alliance, points) VALUES (?,?,?,?)",
        [position, name, alliance, points],
        (err, result) => {
            if (err) {
                console.log(err)
            } else {
                res.send("Values Inserted")
            }
        }
    );
});
实现方案

1. 封装API数据获取函数

和原Mongoose逻辑一致,用async/await处理API请求。注意Node.js 18及以上自带fetch,低版本需安装node-fetch包并导入。

async function fetchPlayerData() {
    try {
        const response = await fetch("http://localhost:3008/api/highscore/players");
        if (!response.ok) {
            throw new Error(`API请求失败,状态码: ${response.status}`);
        }
        const data = await response.json();
        return data.players;
    } catch (err) {
        console.error("获取API数据出错:", err);
        throw err;
    }
}

2. 整合API调用与MySQL插入逻辑

将API调用整合到新的接口中,同时改用批量插入提升性能(避免循环单条插入):

// 假设db是已配置好的MySQL连接实例
app.post('/sync-player-data', async (req, res) => {
    try {
        // 1. 从API拉取数据
        const players = await fetchPlayerData();
        
        if (!players || players.length === 0) {
            return res.status(200).send("没有需要同步的数据");
        }

        // 2. 整理批量插入的参数数组
        const insertValues = players.map(player => [
            player.position,
            player.name,
            player.alliance,
            player.points // 注意字段映射:原Mongoose的score对应MySQL的points
        ]);

        // 3. 执行批量插入
        const sql = "INSERT INTO stats (position, name, alliance, points) VALUES ?";
        db.query(sql, [insertValues], (err, result) => {
            if (err) {
                console.error("插入MySQL出错:", err);
                return res.status(500).send("数据同步失败");
            }
            res.send(`成功同步 ${result.affectedRows} 条数据`);
        });
    } catch (err) {
        console.error("同步流程出错:", err);
        res.status(500).send("数据同步失败");
    }
});

3. 前端触发同步(React部分)

在React组件中通过按钮点击触发后端同步接口:

import React from 'react';

const SyncPlayerData = () => {
    const handleSync = async () => {
        try {
            const response = await fetch('/sync-player-data', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
            });
            const message = await response.text();
            alert(message);
        } catch (err) {
            alert("同步失败,请检查后端服务");
        }
    };

    return (
        <button onClick={handleSync}>同步玩家数据</button>
    );
};

export default SyncPlayerData;

关键注意点

  • 字段映射:确保API返回字段和MySQL表字段一一对应,若名称不一致需手动转换。
  • 错误处理:添加多层错误捕获,避免单个环节崩溃导致整个流程异常,同时返回明确的状态信息。
  • 性能优化:批量插入相比循环单条插入,在数据量较大时能大幅提升效率。

内容的提问来源于stack exchange,提问作者yandry santana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:45:44