You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Expo应用对接Express+Node.js+MySQL后端的技术问题咨询

Expo应用对接Express+Node.js+MySQL后端的技术问题咨询

嘿,我来帮你理清楚这两个问题,都是新手做全栈项目常碰到的卡点,别慌~

一、先给你吃个定心丸:你的技术栈完全兼容!

React Native(不管是Expo还是裸项目)+ Node.js/Express + MySQL 是非常成熟的全栈组合,本地跑完全没问题,完全不用换栈!

如果说想找更轻量的本地替代方案,那可以考虑把MySQL换成SQLite:

  • SQLite是文件型数据库,不用单独装数据库服务,直接用一个.db文件就能存数据,本地开发少了很多配置步骤
  • 后端代码改动极小,只需要把MySQL的连接换成SQLite的连接包就行
  • 但如果你的项目以后要部署到云服务器,MySQL的扩展性会更好,所以看你是要快速做原型还是长期迭代

二、前端怎么把数据传到后端接口?

这个核心就是前端发HTTP请求(GET/POST/PUT/DELETE),后端解析请求体,然后操作数据库,我给你写两个最常用的场景代码,一看就懂:

1. 先搞定后端的基础配置(必须做!)

首先你的Express后端要能解析前端传的JSON数据,还要处理跨域(因为前端是React Native,和后端端口不一样):

// 后端server.js文件
const express = require('express');
const cors = require('cors'); // 解决跨域问题,先装包:npm install cors
const mysql = require('mysql2/promise'); // 用promise版的mysql2,支持async/await,装包:npm install mysql2
const app = express();

// 关键配置:允许跨域 + 解析JSON请求体
app.use(cors());
app.use(express.json());

// MySQL连接配置(本地的话,host是localhost,填你自己的用户名和密码)
const dbConfig = {
  host: 'localhost',
  user: 'root', // 你的MySQL用户名
  password: '123456', // 你的MySQL密码
  database: 'attendance_db' // 你创建的数据库名
};

2. 前端传数据到后端的示例(比如注册学生到/students接口)

前端用axios会比原生fetch更方便(先装包:npm install axios),写一个提交注册信息的函数:

// React Native前端(比如RegisterScreen.js)
import axios from 'axios';

// 假设你有输入框拿到了用户名、密码、学号
const handleRegister = async (username, password, studentId) => {
  try {
    // 注意:本地测试不能用localhost,要用你电脑的实际IP(比如192.168.3.10)
    // 因为模拟器/真机和电脑的localhost不是同一个地址
    const response = await axios.post('http://192.168.3.10:3000/students', {
      username: username,
      password: password,
      student_id: studentId
    });
    
    alert('注册成功!');
    console.log('后端返回的数据:', response.data);
    // 这里可以跳转到登录页
  } catch (error) {
    // 捕获错误,给用户提示
    alert('注册失败:' + (error.response?.data?.message || '网络问题'));
    console.error('请求出错:', error);
  }
};

3. 后端接收数据并操作MySQL的示例

对应上面的前端请求,后端写/students的POST接口:

// 后端server.js里加这个接口
app.post('/students', async (req, res) => {
  try {
    // 从请求体里拿到前端传的所有数据
    const { username, password, student_id } = req.body;

    // 连接MySQL数据库
    const connection = await mysql.createConnection(dbConfig);
    
    // 执行插入数据的SQL语句(用?占位符防止SQL注入!)
    const [result] = await connection.execute(
      'INSERT INTO students (username, password, student_id) VALUES (?, ?, ?)',
      [username, password, student_id]
    );

    // 关闭数据库连接
    await connection.end();

    // 返回成功响应给前端
    res.status(201).json({
      message: '学生注册成功',
      studentId: result.insertId // 返回插入的学生ID
    });
  } catch (error) {
    console.error('数据库操作出错:', error);
    // 返回错误响应给前端
    res.status(500).json({ message: '注册失败,请稍后重试' });
  }
});

// 启动后端服务,监听3000端口
app.listen(3000, () => {
  console.log('后端服务启动成功,地址:http://localhost:3000');
});

4. 其他接口(/attendance、/reports)的逻辑是一样的

比如提交考勤到/attendance接口,就是前端POST考勤数据(学生ID、课程ID、考勤状态),后端解析后插入到attendance表;/reports接口可以是GET请求,前端传查询条件(比如日期范围、班级),后端查数据库后返回统计数据。

三、本地测试的小坑要注意!

  1. 不要用localhost!:React Native模拟器/真机访问本地后端,必须用电脑的实际局域网IP(比如192.168.x.x),可以在电脑终端用ipconfig(Windows)或ifconfig(Mac/Linux)查到
  2. MySQL要先启动本地服务:确保你的MySQL本地服务是开着的,数据库和表已经创建好了
  3. SQL语句要写对:比如表名、字段名要和你数据库里的一致,别打错字

如果还有具体的报错(比如跨域、数据库连接失败、请求发不出去),把错误信息贴出来,我再帮你排查~

火山引擎 最新活动