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

React Native通过Express访问MySQL数据库时遇返回undefined及服务器崩溃问题

我来帮你排查这个问题,咱们一步步拆解原因和对应的解决方案:

核心问题分析

你的Express服务器崩溃、前端拿到undefined,主要是后端代码的数据库连接和错误处理逻辑有问题,前端也有个小细节需要注意:

  • 后端未处理连接错误:connection.getConnection的回调里没处理err参数,如果数据库连接失败,直接会抛出未捕获异常导致服务器崩溃。
  • 未释放数据库连接:获取到连接后,不管查询成功还是失败,都没调用connection.release()把连接放回连接池,这会导致连接池耗尽,后续请求无法获取连接,最终服务器挂掉。
  • 错误处理不当:connection.query里直接throw error,没有通过响应把错误返回给前端,同时未捕获的异常会直接导致Express服务器崩溃。
  • 前端的同步打印问题:你在useEffect里直接console.log(data),此时setData是异步操作,还没完成状态更新,所以会打印初始的空数组,但这不是拿到undefined的主要原因。
修复后的后端代码(Route.js)

把后端代码改成这样,修复连接和错误处理的问题:

const express = require('express');
const mysql = require('mysql');

// 创建连接池
const connectionPool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: '',
  database: 'agora'
});

const app = express();

app.get('/projets', (req, res) => {
  // 从连接池获取连接,处理连接错误
  connectionPool.getConnection((err, conn) => {
    if (err) {
      console.error('数据库连接失败:', err);
      return res.status(500).json({ error: '数据库连接失败,请检查服务状态' });
    }

    // 执行查询
    conn.query('SELECT * FROM projet', (error, results) => {
      // 无论查询结果如何,都要释放连接回连接池
      conn.release();

      if (error) {
        console.error('数据查询失败:', error);
        return res.status(500).json({ error: '查询数据失败,请检查表结构和SQL语句' });
      }

      // 返回JSON格式的查询结果
      res.json(results);
    });
  });
});

app.listen(3000, () => {
  console.log('服务器已启动,访问 http://localhost:3000/projets 查看数据');
});
前端代码的优化建议

前端可以加响应状态检查,同时监听data的变化来打印最新值:

const [data, setData] = useState([]);

useEffect(() => {
  fetch('http://localhost:3000/projets')
    .then(response => {
      // 先检查HTTP响应是否成功
      if (!response.ok) {
        throw new Error(`请求失败,状态码:${response.status}`);
      }
      return response.json();
    })
    .then(jsonData => {
      console.log('成功获取到数据:', jsonData);
      setData(jsonData);
    })
    .catch(error => {
      console.error('请求出错:', error);
    });
}, []);

// 监听data状态变化,打印更新后的数据
useEffect(() => {
  console.log('当前数据状态:', data);
}, [data]);
额外注意事项
  1. 确保你的MySQL服务正在运行,数据库agora和表projet存在,且字段名和你期望的一致(比如idProjet、nomProjet等)。
  2. 如果是React Native真机测试,localhost无法访问本地服务器,需要替换成电脑的局域网IP地址(比如http://192.168.1.100:3000/projets,具体IP可以通过ipconfig或ifconfig查看)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:12:48