前言
前四篇我们在Unity里直连MySQL跑通了CRUD。但正如第1篇强调的:生产环境严禁客户端直连数据库。本篇搭建一个Node.js + Express的HTTP API中间层,Unity客户端通过HTTP请求与服务端交互,密码和SQL永远不离开服务器。
一、为什么必须加API中间层?
| 风险 | 直连MySQL ❌ | HTTP API ✅ |
|---|---|---|
| 密码泄露 | 连接字符串可被反编译 | 密码只在服务器内存中 |
| SQL注入 | 客户端构造SQL | 服务端参数化查询 |
| 权限失控 | 玩家能执行任意SQL | 接口白名单+鉴权 |
| 并发瓶颈 | 每个客户端占一个DB连接 | 连接池复用+限流 |
| 业务校验 | 无法保证 | 服务端统一校验 |
| 审计日志 | 无 | 全链路请求日志 |
二、技术栈选择
1 | 运行时: Node.js 20 LTS |
💡 选Node.js是因为前后端统一JavaScript/TypeScript生态,上手最快。Go/C#/Python同样可行,架构思路完全一致。
三、项目结构
1 | game-api/ |
四、核心代码实现
4.1 数据库连接池
1 | // src/config/db.js |
4.2 玩家Model层(SQL操作)
1 | // src/models/playerModel.js |
⚠️ 注意:
pool.execute()使用prepared statements,天然防SQL注入。永远不要用pool.query()拼接字符串。
4.3 Controller层(业务逻辑)
1 | // src/controllers/playerController.js |
4.4 JWT验证中间件
1 | // src/middleware/auth.js |
4.5 路由注册
1 | // src/routes/player.js |
4.6 Express入口
1 | // src/app.js |
五、Unity客户端调用
1 | // Assets/Scripts/Network/GameApiClient.cs |
六、API安全Checklist
| 检查项 | 实现方式 |
|---|---|
| ✅ 密码BCrypt哈希 | bcryptjs saltRounds=12 |
| ✅ JWT签名验证 | HS256 + 环境变量SECRET |
| ✅ Token过期机制 | expiresIn: 7d |
| ✅ 参数化查询 | mysql2 execute() prepared statements |
| ✅ 输入长度校验 | express-validator (建议添加) |
| ✅ CORS限制 | cors中间件白名单域名 |
| ✅ 速率限制 | express-rate-limit (建议添加) |
| ✅ HTTPS传输 | Nginx反向代理 + Let’s Encrypt |
| ✅ 敏感配置外置 | .env文件 + dotenv |
| ✅ 错误信息脱敏 | 生产环境不暴露stack trace |
总结
本篇完成了从”客户端直连”到”API中间层”的关键跃迁。Unity只发HTTP请求,MySQL只在服务器上被访问——这条边界一旦划清,安全性就上了一个量级。Node.js + Express只是载体,换成Go Gin / C# ASP.NET / Python FastAPI,架构思路完全相同。
下一篇是终章实战:把前面所有知识串联成一个完整的玩家管理系统Demo。
说些什么吧!