尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Egg.js 接 MySQL 数据库:Sequelize 教程,6 步做出带分页的用户增删改查接口
Egg.js 接 MySQL 数据库Sequelize 教程6 步做出带分页的用户增删改查接口【免费下载链接】hotgoHotGo 是AI 赋能企业级全栈前后端分离开发及移动应用基础平台基于 Vue 和 GoFrame2.0 构建内置 AI 开发规范、适配主流 AI 开发工具人机协同高效开发。集成 jwt 鉴权、动态路由菜单、casbin 鉴权、消息队列、定时任务等功能预置各类常用场景文件助力专注业务开发。项目地址: https://gitcode.com/GitHub_Trending/ho/hotgo本文用 Egg.js 搭配 Sequelize ORM 连接 MySQL 数据库手把手做出一个支持分页的用户增删改查接口。全程围绕一条任务主线推进从空项目起步到接口能返回数据为止每一步都只写跑通所必需的东西。1. 先定目标一条带分页的用户列表动手之前先把交付物说清楚在 Egg.js 项目里做出一组/api/users接口覆盖列表分页、详情、新建、更新、删除五种操作数据全部读写 MySQL。拆成 6 步初始化项目、装依赖启用 egg-sequelize 插件配置数据库连接定义 User 模型写 service 与 controller注册路由并验证初始化项目在你想放代码的目录下执行npx egg-init my-egg-app --typesimple cd my-egg-app npm install再补三个依赖npm install egg-sequelize sequelize mysql2 --save三者分工明确sequelize是 ORM 本体mysql2是 MySQL 驱动egg-sequelize负责把前两者挂进 Egg.js 的生命周期让app.model在启动时就绪。装完重启应用插件会自动初始化连接池。2. 3 行配置连上 MySQL裸写 SQL维护到第三张表就崩了字段拼错了、转义漏了、分页算歪了全是手滑空间。ORM 可以理解为替你和数据库对话的翻译官你传 JavaScript 对象进去它还你对象出来中间的 SQL 由它生成。启用插件打开config/plugin.js两行启用exports.sequelize { enable: true, package: egg-sequelize, };配连接参数在config/config.default.js里补上连接信息config.sequelize { dialect: mysql, host: 127.0.0.1, database: your_database, username: root, password: your_password, };两个小建议账号密码别提交进共享仓库建议放到本地config/local.js里覆盖默认值dialect想换 PostgreSQL 或 SQLite 时改这一行并装上对应驱动即可。保存后启动项目控制台没有连接报错就说明 Egg.js 和数据库已经握手成功。3. Sequelize 模型定义一个文件描述一张表模型Model是 ORM 里表的映射你只需要声明字段和类型查询、建表、校验都围绕它展开。在app/model/下新建user.jsmodule.exports app { const { STRING, INTEGER } app.Sequelize; return app.model.define(user, { id: { type: INTEGER, primaryKey: true, autoIncrement: true }, name: STRING(30), age: INTEGER, email: STRING(100), }); };几个容易忽略的点字段名用下划线命名如created_atSequelize 默认会映射成蛇形列名模型默认带created_at、updated_at两个时间戳写入时自动填充不用手写开发阶段可以用app.model.sync()让 Sequelize 根据模型自动建表生产环境建议改用迁移脚本管理表结构避免误改线上表。4. 把增删改查写进 service 和 controllerEgg.js 的惯例是分层controller 只管收参数、回响应service 管查询逻辑。这样同一个查询方法以后能被定时任务、其他接口复用。service 里写分页查询新建app/service/user.jsconst { Service } require(egg); class UserService extends Service { async page({ page 1, pageSize 10 } {}) { const { User } this.app.model; const offset (page - 1) * pageSize; const { rows, count } await User.findAndCountAll({ offset, limit: pageSize, order: [[id, desc]], }); return { list: rows, total: count, page, pageSize }; } async create(data) { return this.app.model.User.create(data); } async update(id, data) { return this.app.model.User.update(data, { where: { id } }); } async destroy(id) { return this.app.model.User.destroy({ where: { id } }); } } module.exports UserService;findAndCountAll是关键方法一次调用同时返回当前页数据和总条数前端分页器要的list和total正好齐活不用自己拼两次查询。controller 与路由各占一行核心app/controller/user.jsconst { Controller } require(egg); class UserController extends Controller { async index() { const { page, pageSize } this.ctx.query; const data await this.service.user.page({ page, pageSize }); this.ctx.body data; } async create() { const user await this.service.user.create(this.request.body); this.ctx.status 201; this.ctx.body user; } // show、update、destroy 同理按 this.ctx.params.id 调用 service } module.exports UserController;路由注册只需要一行app.resources(users, /api/users, controller.user);app.resources会一次性铺开标准 REST 风格的一组路由列表、详情、新建、更新、删除全都有不用手写七条。接口接上前端后最终呈现的列表页大致长这样需要关联查询时用户表之外还有文章表在模型里声明关系查询时用include带出来User.hasMany(app.model.Post, { as: posts }); User.findByPk(id, { include: [{ model: app.model.Post, as: posts }], });这样一条查询就能把用户和他的文章一起取回避免先查用户、再逐个查文章的 N1 写法。带出关联数据后的列表效果可以参考这种层级展开的形态5. 踩坑清单四个高频报错这些错我基本每次都见遇到时先对号入座启动报找不到 sequelize 相关属性—— 九成是插件没启用或config/plugin.js里package名字拼错检查第二节。connect ECONNREFUSED / Access denied—— 前者是 host、端口连不上确认 MySQL 已启动后者是账号密码不对拿命令行先登一遍再改配置。Table xxx.user doesnt exist—— 模型定义好了但表没建。开发期先sync()跑通正式环境走迁移。分页永远只有一条—— 查一下pageSize。URL 里的 query 参数都是字符串(page - 1) * pageSize这种算式遇到字符串会出怪结果记得用Number()转一下。 排查连接类问题最快的办法写一个最小脚本单独跑一次app.model.User.findAll()绕开路由和中间件能立刻分清是连接问题还是代码问题。6. 接下来做什么四件事按顺序排接口能跑只是起点。建议按这个顺序继续事务一次请求要写多张表时用app.model.transaction()包起来成功commit失败rollback防止出现用户建了、积分没加的半成品数据查询瘦身列表接口用attributes只取需要的列大字段如富文本单独在详情接口里查入参校验在 controller 入口用校验规则拦截脏数据别让空name一路漏到数据库迁移脚本引入 sequelize-cli 管理表结构变更每次改模型都留一份可回滚的迁移记录。行动清单对着勾本地建好库表启用 egg-sequelize 后应用能正常启动User 模型 五个基础接口全部返回正确数据列表接口带上page/pageSize参数返回list和total挑一个多表写入的场景用事务包一遍并手动制造失败验证回滚【免费下载链接】hotgoHotGo 是AI 赋能企业级全栈前后端分离开发及移动应用基础平台基于 Vue 和 GoFrame2.0 构建内置 AI 开发规范、适配主流 AI 开发工具人机协同高效开发。集成 jwt 鉴权、动态路由菜单、casbin 鉴权、消息队列、定时任务等功能预置各类常用场景文件助力专注业务开发。项目地址: https://gitcode.com/GitHub_Trending/ho/hotgo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

叉车安全系统,不再只靠制度管人|技术守住厂区人车混行红线

叉车安全系统,不再只靠制度管人|技术守住厂区人车混行红线

很多制造、仓储企业都有同样的感受:叉车天天跑,安全会月月开,培训、巡检、张贴警示标语一套流程做满,事故隐患依旧防不住。行业统计显示,叉车事故里41% 是人车碰撞事故,挤压类事故占 44%,两类叠…

📅 2026/10/22 12:51:15
TCP网络编程:内存池到底怎么实现的(kvstore)

TCP网络编程:内存池到底怎么实现的(kvstore)

一、为什么需要内存池 在 KV 存储服务里,每次处理命令都要动态分配响应缓冲区。如果频繁 malloc / free,会有两个问题: 性能开销:malloc 涉及系统调用和堆管理,频繁调用很慢。 内存碎片:大量小块分配释放…

📅 2026/10/22 12:51:15
把ECCV2022-RIFE集成进自己的视频管线:Model.inference API与TTA技巧开发指南

把ECCV2022-RIFE集成进自己的视频管线:Model.inference API与TTA技巧开发指南

深度学习计算机视觉 【免费下载链接】ECCV2022-RIFE Ascend-SACT/ECCV2022-RIFE是基于PyTorch的开源项目,支持中英双语,采用MIT许可。依托NPU硬件加速,实现高效视频插帧,为开发者提供强大的视频增强工具,助力提升视频流…

📅 2026/10/22 12:51:15
MORE NEWS

更多资讯

📰

上下文工程实战:从72%到91%准确率的智能体优化复盘

从一次客服机器人改版说起:我把一个"看起来什么都懂"的智能体,从准确率72%调到了91%,单次调用成本还降了一半以上。这个过程中最深刻的体会是——模型本身没换,prompt也没有玄学式的反复修改,真正的杠杆在上…

📰

数字串123222工程实战:进制转换、质因数分解与分布式分片

我看到“123222”这种数字串,第一反应不是“这有什么可挖的”,而是“这能当多少种样本用”。六位数字,字符组成简单,却同时具备统计特征、数学性质、进制转换后的多重身份,甚至可以直接扔进测试用例、分布式分片和校验…

📰

RESTful接口设计:资源、路径、方法的对应关系全拆解

RESTful 接口这块,很多团队聊起来能聊一下午,但真到写代码的时候,最容易出问题的反而是最基础的三个词:资源、路径、方法。我见过不少前后端联调翻车的现场,根因几乎都不是框架不会用,而是这三者的对应关系…

📰

仿微信登录注册界面:Android Studio线性布局实现与避坑指南

简介:面向 Android 初学者的仿微信登录注册界面完整工程包,采用 Java 与 Android Studio 实现,重点演示线性布局 LinearLayout 的垂直/水平排列、layout_weight 权重分配、EditText 与 Button 样式定制,并涵盖登录与注册页间的 In…

📰

提示工程持续部署:从版本化到灰度回滚的完整策略

最近在搭提示工程持续部署机制的时候,我被问得最多的一个问题特别直接:Prompt也要做持续部署?不都是改完直接上线看效果吗?这个问题的背后,其实是很多团队仍然在用“改代码、跑测试、发版”那套传统CD思路来管理人机交…

📰

AI办公提效实战:提示词与校验如何改造周报、对账和会议纪要

到了2026年,AI办公早就不是什么遥远概念,而是我每天打开电脑就要面对的事。身边有人对各种新功能如数家珍,也有人还在用最原始的方式手工填表、逐句改汇报,最后被大量低水平重复劳动拖到晚上九十点。说白了,AI工具已经…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬