Node.js+Koa2+MySQL 打造前后端分离项目(视频教程)
概述
- 使用 Node.js + Koa2 + MySQL 打造前后端分离架构是一种高效且流行的方案,下面是详细的实现步骤和核心代码示例
- 视频教程:
https://pan.quark.cn/s/063a739d40e6
一、技术栈概述
- 后端:Node.js(运行环境)、Koa2(Web 框架)、MySQL(数据库)、Sequelize(ORM 工具,可选)
- 前端:任意前端框架(如 Vue/React/Angular),通过 AJAX/axios 调用后端接口
- 核心思想:后端仅提供 API 接口,前端负责页面渲染和交互,通过 HTTP 协议通信
二、后端实现步骤
1. 初始化项目
mkdir koa-mysql-demo && cd koa-mysql-demo
npm init -y
npm install koa koa-router koa-bodyparser mysql2 sequelize # 核心依赖
npm install nodemon -D # 开发热重载工具
2. 配置 MySQL 连接
创建 config/db.js
配置数据库连接:
const { Sequelize } = require('sequelize');// 初始化 Sequelize(ORM 工具,简化 SQL 操作)
const sequelize = new Sequelize('your_db_name', // 数据库名'root', // 用户名'your_password', // 密码{host: 'localhost',dialect: 'mysql',port: 3306,timezone: '+08:00' // 时区设置(重要)}
);// 测试连接
sequelize.authenticate().then(() => console.log('MySQL 连接成功')).catch(err => console.error('连接失败:', err));module.exports = sequelize;
3. 定义数据模型(Model)
创建 models/user.js
定义用户模型:
const { DataTypes } = require('sequelize');
const sequelize = require('../config/db');// 定义 User 模型(对应数据库表 users)
const User = sequelize.define('User', {username: {type: DataTypes.STRING,allowNull: false,unique: true},password: {type: DataTypes.STRING,allowNull: false},email: {type: DataTypes.STRING,validate: {isEmail: true}}
}, {tableName: 'users', // 显式指定表名timestamps: true // 自动添加 createdAt 和 updatedAt 字段
});// 同步模型到数据库(开发环境使用)
User.sync({ alter: true }); // 自动更新表结构module.exports = User;
4. 编写 Koa 路由与控制器
创建 routes/user.js
定义用户相关接口:
const Router = require('koa-router');
const router = new Router({ prefix: '/api/users' }); // 接口前缀
const User = require('../models/user');// 1. 获取所有用户
router.get('/', async (ctx) => {try {const users = await User.findAll();ctx.body = {code: 200,data: users,message: '查询成功'};} catch (err) {ctx.status = 500;ctx.body = { code: 500, message: '服务器错误' };}
});// 2. 创建用户
router.post('/', async (ctx) => {const { username, password, email } = ctx.request.body;try {const user = await User.create({ username, password, email });ctx.body = { code: 201, data: user, message: '创建成功' };} catch (err) {ctx.status = 400;ctx.body = { code: 400, message: '参数错误' };}
});module.exports = router;
5. 初始化 Koa 应用
创建 app.js
作为入口文件:
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const userRouter = require('./routes/user');const app = new Koa();// 中间件
app.use(bodyParser()); // 解析请求体(JSON/FormData)
app.use(async (ctx, next) => {// 跨域处理ctx.set('Access-Control-Allow-Origin', '*');ctx.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');ctx.set('Access-Control-Allow-Headers', 'Content-Type');await next();
});// 注册路由
app.use(userRouter.routes());
app.use(userRouter.allowedMethods()); // 处理 405/501 等错误// 启动服务
const PORT = 3000;
app.listen(PORT, () => {console.log(`服务器运行在 http://localhost:${PORT}`);
});
6. 启动后端服务
在 package.json
中添加脚本:
"scripts": {"dev": "nodemon app.js"
}
运行:
npm run dev
三、前端调用示例(以 Vue 为例)
使用 axios
调用后端 API:
// 安装 axios
// npm install axiosimport axios from 'axios';// 配置基础路径
axios.defaults.baseURL = 'http://localhost:3000/api';// 获取所有用户
async function getUsers() {try {const res = await axios.get('/users');console.log(res.data); // { code: 200, data: [...], message: '查询成功' }} catch (err) {console.error(err);}
}// 创建用户
async function createUser(userData) {try {const res = await axios.post('/users', userData);console.log(res.data);} catch (err) {console.error(err);}
}
四、核心注意事项
- 跨域处理:通过 Koa 中间件设置
Access-Control-Allow-*
头,或使用koa-cors
插件。 - 安全问题:
- 密码需加密存储(如使用
bcrypt
)。 - 接口需验证权限(如使用
koa-jwt
生成 token)。
- 密码需加密存储(如使用
- 错误处理:全局捕获异常,避免服务崩溃。
- 生产环境:
- 关闭
sequelize.sync()
自动同步,改用迁移工具(sequelize-cli
)。 - 使用环境变量存储敏感配置(如
dotenv
)。
- 关闭
五、扩展方向
- 集成
koa-static
提供静态文件服务(如图片)。 - 使用
joi
或zod
进行请求参数校验。 - 实现分页、排序、筛选等高级查询功能。
- 接入日志工具(如
winston
)和监控系统。
通过以上步骤,即可快速搭建一个前后端分离的 Node.js + Koa2 + MySQL 服务,前端可独立开发并通过 API 与后端交互。