概述
- 使用 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. 初始化项目
bash
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 配置数据库连接:
javascript
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 定义用户模型:
javascript
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 定义用户相关接口:
javascript
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 作为入口文件:
javascript
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 中添加脚本:
json
"scripts": {
"dev": "nodemon app.js"
}
运行:
bash
npm run dev
三、前端调用示例(以 Vue 为例)
使用 axios 调用后端 API:
javascript
// 安装 axios
// npm install axios
import 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 与后端交互。