当前位置: 首页 > article >正文

从零搭建 Express + Sequelize + MySQL 全栈 API 项目(含 Docker 部署)

本文将手把手带你使用Express搭建一个支持增删改查CRUD的后端 API 项目集成SequelizeORM 操作 MySQL 数据库并通过Docker Desktop容器化运行。涵盖项目初始化、热更新配置、数据库迁移、种子数据填充及完整 RESTful 接口实现。一、创建 Express 项目1. 全局安装 express-generatornpm install express-generator -g2. 创建无视图模板的项目express --no-view clwy-api cd clwy-api npm install也可以分步执行express --no-view clwy-api cd clwy-api npm install3. 启动项目npm start运行成功后访问 http://localhost:3000/二、使用 Nodemon 实现热更新每次修改代码都要手动重启用nodemon自动监听文件变化并重启1. 全局安装 nodemonnpm install nodemon -g2. 修改package.json将scripts.start改为使用nodemon{ name: clwy-api, version: 0.0.0, private: true, scripts: { start: nodemon ./bin/www }, dependencies: { cookie-parser: ~1.4.4, debug: ~2.6.9, express: ~4.16.1, morgan: ~1.9.1 } }三、使用 Docker Desktop 运行 MySQL1. 下载并安装 Docker Desktop官网地址https://www.docker.com/products/docker-desktop/Windows 用户选择AMD64版本安装完成后启动应用2. 启动 MySQL 容器示例docker-compose.ymlversion: 3.8 services: mysql: image: mysql:8.3.0 command: --default-authentication-pluginmysql_native_password environment: - MYSQL_ROOT_PASSWORDclwy1234 ports: - 13306:3306在项目根目录运行docker compose up -d注意这里将容器的3306映射到宿主机的13306后续连接需使用13306端口。四、集成 Sequelize 操作数据库1. 安装依赖# 全局安装 CLI 工具 npm install -g sequelize-cli # 本地安装核心库 npm install sequelize mysql2 Sequelize 中文文档https://www.sequelize.cn/2. 初始化 Sequelize 项目sequelize init生成以下目录结构对应项目中的文件位置config/config.json项目的配置文件里面存放着不同环境下development-开发环境、test-测试环境、production-生产环境的数据库的配置信息比如数据库的连接地址、用户名、密码、数据库名等等需要把对应的配置信息填写进去。migrations文件夹存放着数据库迁移文件比如创建数据库表、添加字段等等。models文件夹存放着数据库模型文件比如定义数据库表结构、字段类型、字段约束等等。seeders文件夹存放着数据填充文件比如初始化数据库数据等等3. 配置数据库连接编辑config/config.json填入你的 MySQL 信息以开发环境为例{ development: { username: root, password: clwy1234, database: clwy, host: 127.0.0.1, port: 13306, dialect: mysql } }port必须与 Docker 映射的宿主机端口一致这里是13306。五、创建模型、迁移与种子数据1. 生成 Articles 模型sequelize model:generate --name Articles --attributes title:string,content:text生成models/articles.js生成migrations/时间戳-create-articles.js2. 执行数据库迁移sequelize db:migrate此时数据库会自动创建articles表。3. 生成并填充测试数据(1) 生成种子文件sequelize seed:generate --name articles✅ 生成seeders/时间戳-articles.js(2) 修改种子文件插入 100 条测试数据// seeders/20260313120000-articles.js module.exports { up: async (queryInterface, Sequelize) { const articles []; for (let i 1; i 100; i) { articles.push({ title: 新闻标题 ${i}, content: 这是第 ${i} 条新闻的详细内容..., createdAt: new Date(), updatedAt: new Date() }); } await queryInterface.bulkInsert(Articles, articles, {}); }, down: async (queryInterface, Sequelize) { await queryInterface.bulkDelete(Articles, null, {}); } };(3) 执行种子填充sequelize db:seed --seed 20260313120000-articles✅ 成功插入 100 条数据六、实现 CRUD 接口1. 查询所有文章在routes/admin/articles.js中添加const express require(express); const router express.Router(); const { Articles } require(../../models); /* GET /admin/articles - 查询所有文章 */ router.get(/, async (req, res) { try { const articles await Articles.findAll({ order: [[id, DESC]] }); res.json({ status: true, data: { articles }, message: 查询成功 }); } catch (error) { res.status(500).json({ status: false, message: error.message }); } });在app.js中注册路由const adminArticlesRouter require(./routes/admin/articles); app.use(/admin/articles, adminArticlesRouter);✅ 测试接口GET http://localhost:3000/admin/articles2. 查询文章详情/* GET /admin/articles/:id - 查询文章详情 */ router.get(/:id, async (req, res) { try { const { id } req.params; if (!id) return res.status(400).json({ status: false, message: id不能为空 }); const article await Articles.findByPk(id); if (!article) return res.status(404).json({ status: false, message: 文章不存在 }); res.json({ status: true, data: { data: article }, message: 查询成功 }); } catch (error) { res.status(500).json({ status: false, message: error.message }); } });✅ 测试GET http://localhost:3000/admin/articles/13. 创建文章/* POST /admin/articles - 创建文章 */ router.post(/, async (req, res) { try { const { title, content } req.body; if (!title) return res.status(400).json({ status: false, message: 标题不能为空 }); const result await Articles.create({ title, content }); res.json({ status: true, data: { data: result }, message: 创建成功 }); } catch (error) { res.status(500).json({ status: false, message: error.message }); } });✅ 测试POST http://localhost:3000/admin/articlesBody: JSON4. 修改文章/* PUT /admin/articles - 修改文章 */ router.put(/, async (req, res) { try { const { id, title, content } req.body; if (!id || !title) return res.status(400).json({ status: false, message: 参数错误 }); const [updated] await Articles.update({ title, content }, { where: { id } }); if (updated 0) return res.status(404).json({ status: false, message: 文章未找到 }); res.json({ status: true, message: 修改成功 }); } catch (error) { res.status(500).json({ status: false, message: error.message }); } });✅ 测试PUT http://localhost:3000/admin/articles5. 删除文章/* DELETE /admin/articles/:id - 删除文章 */ router.delete(/:id, async (req, res) { try { const { id } req.params; if (!id) return res.status(400).json({ status: false, message: id不能为空 }); const deleted await Articles.destroy({ where: { id } }); if (deleted 0) return res.status(404).json({ status: false, message: 文章不存在 }); res.json({ status: true, message: 删除成功 }); } catch (error) { res.status(500).json({ status: false, message: error.message }); } });✅ 测试DELETE http://localhost:3000/admin/articles/1

相关文章:

从零搭建 Express + Sequelize + MySQL 全栈 API 项目(含 Docker 部署)

本文将手把手带你使用 Express搭建一个支持 增删改查(CRUD)的后端 API 项目,集成 Sequelize ORM 操作 MySQL 数据库,并通过 Docker Desktop 容器化运行。涵盖项目初始化、热更新配置、数据库迁移、种子数据填充及完整 RESTful 接口…...

Qt LinuxFB 嵌入式界面旋转与触摸校准实战

1. 为什么需要自己动手修改Qt LinuxFB插件? 在嵌入式Linux项目里,尤其是工业控制面板、竖屏广告机或者一些特殊形态的智能终端上,我们经常会遇到一个很实际的需求:屏幕需要旋转显示。比如,一个7寸的屏幕被竖着安装&am…...

告别炉石日常繁琐:智能自动化工具的全场景应用指南

告别炉石日常繁琐:智能自动化工具的全场景应用指南 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-S…...

NPYViewer:革新性NumPy数据可视化工具,让科学数据直观呈现

NPYViewer:革新性NumPy数据可视化工具,让科学数据直观呈现 【免费下载链接】NPYViewer Load and view .npy files containing 2D and 1D NumPy arrays. 项目地址: https://gitcode.com/gh_mirrors/np/NPYViewer 在数据驱动的科研与工程领域&#…...

为什么有的企业做成了主数据管理,有的企业越做越乱

先问大家一个问题:你们公司的数据,现在是个什么状态?我做数据咨询这么多年,跟各行各业的企业打过交道,遇到最多的情况是这样的:销售部说客户有5000个,市场部说才3200个,财务部报上来…...

Android Studio 中文界面配置指南:提升开发效率的完整方案

Android Studio 中文界面配置指南:提升开发效率的完整方案 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack Android St…...

Horos:医疗影像处理的全流程开源解决方案

Horos:医疗影像处理的全流程开源解决方案 【免费下载链接】horos Horos™ is a free, open source medical image viewer. The goal of the Horos Project is to develop a fully functional, 64-bit medical image viewer for OS X. Horos is based upon OsiriX an…...

Qwen-Image-Layered实测效果:独立图层让后期编辑变得如此简单

Qwen-Image-Layered实测效果:独立图层让后期编辑变得如此简单 1. 引言 想象一下,你刚用AI生成了一张完美的设计图:一个宇航员站在月球上,背景是深邃的星空和地球。但客户突然说:“宇航员的头盔能不能换成金色&#x…...

Macro average 和 Weighted average【把每个类别的指标聚合成一个总体指标】

Macro average 和 Weighted average 是评价分类模型性能时常用的两种汇总方法,它们本质上都是把每个类别的指标聚合成一个总体指标,但对数据分布的敏感度不同。针对你的作物病害zero-shot分类项目,它们的作用差异尤其重要。下面详细说明&…...

RPC超时原因

RPC 超时,3个方向:上游问题 下游问题 中间链路问题 一、上游(调用方)原因超时时间设太短 业务本身要 500ms,你超时只设 200ms,必超时。上游线程池耗尽 上游线程不够用,请求发不出去&#xff0…...

硬性条件全达标,入职3天就崩盘?DeepSeek深度拆解招聘伪胜任力陷阱:90%企业忽略的底层能力评估模型

为什么很多候选人简历上硬性条件完全符合岗位要求,入职后却很快暴露底层能力不足的问题?如何有效避免这种招聘失误?答:招聘中最大的陷阱莫过于"伪胜任力"现象——候选人表面条件完美匹配,实则缺乏支撑岗位长…...

ARM内核A核、R核和M核的异同点和应用场景

一、ARM内核A核、R核和M核的基本概念和异同点 ARM内核架构包括A核、R核和M核,它们各自具有不同的特点和应用场景: ARM Cortex-A核: 特点:Cortex-A核是ARM架构中的应用处理器核。它通常用于高性能计算和通用操作系统的执行&#…...

n8n 严重漏洞可导致RCE和存储凭据暴露

聚焦源代码安全,网罗国内外最新资讯!编译:代码卫士网络安全研究人员披露了位于n8n工作流自动化平台中的两个严重漏洞,它们可导致任意命令执行,现已修复。CVE-2026-27577(CVSS评分:9.4&#xff0…...

立创开源:基于N32G430与MPU6050的自行车RGB呼吸灯状态指示器设计与实现

立创开源:基于N32G430与MPU6050的自行车RGB呼吸灯状态指示器设计与实现 大家好,最近我把自己用了四年的自行车改装了一下,给它装上了一双会“呼吸”的眼睛。这是一个基于国产MCU N32G430和MPU6050六轴传感器的小装置,能根据你骑行…...

基于ESP32与多传感器融合的立创空气质量检测净化器DIY全攻略

基于ESP32与多传感器融合的立创空气质量检测净化器DIY全攻略 最近想给工作室弄个能实时监测空气质量的设备,市面上成品要么功能单一,要么价格不菲。正好看到立创开源平台上有位大佬分享了一个完整的空气质量检测净化器项目,功能非常全面&…...

QT径向渐变完全指南:从参数解析到高级特效(QRadialGradient详解)

QT径向渐变完全指南:从参数解析到高级特效 在UI设计领域,渐变效果一直是提升视觉层次感的利器。而QT框架中的QRadialGradient,更是让开发者能够轻松创建出令人惊艳的环形渐变效果。不同于常见的线性渐变,径向渐变以圆心为中心向外…...

ESP32端云协同语音助手:嵌入式AI交互系统设计与实现

1. 项目概述ESP32-AI语音助手是一个面向嵌入式边缘智能交互场景的软硬协同系统,其核心目标是将大语言模型(LLM)能力下沉至资源受限的MCU级平台,在不依赖手机或PC中转的前提下,实现端侧语音唤醒、语义理解、多模态响应与…...

Phi-4-mini-reasoning与Anaconda集成:数据科学工作流优化

Phi-4-mini-reasoning与Anaconda集成:数据科学工作流优化 1. 引言 如果你经常用Anaconda做数据分析,可能会遇到这样的情况:面对一堆复杂的数据,明明知道里面藏着有价值的信息,却不知道从哪里开始分析。或者遇到需要多…...

如何解决Windows系统AirPods功能缺失问题?AirPodsDesktop全方位增强方案实测

如何解决Windows系统AirPods功能缺失问题?AirPodsDesktop全方位增强方案实测 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDes…...

RK3588-PPS GPIO 配置笔记总结

1. 概述 本文档详细介绍如何在 RK3588 平台上将 GPIO1_B1 配置为接收 PPS(Pulse Per Second,秒脉冲)信号,用于高精度时间同步。PPS 信号通常由 GPS 模块提供,可实现微秒级的时间同步精度。 2. 设备树配置 2.1 Pinctrl …...

GLM-OCR模型原理浅析:从卷积神经网络到Transformer的演进

GLM-OCR模型原理浅析:从卷积神经网络到Transformer的演进 最近在做一个文档识别的项目,需要从各种复杂的扫描件里提取文字信息。试了好几个开源方案,发现基于Transformer架构的OCR模型效果确实比传统方法强不少,尤其是对排版复杂…...

Qwen3-0.6B-FP8极速部署教程:Windows/Linux/macOS三端兼容方案

Qwen3-0.6B-FP8极速部署教程:Windows/Linux/macOS三端兼容方案 想在自己的电脑上跑一个大模型,但又担心配置不够、速度太慢?今天给大家介绍一个“小钢炮”级别的AI对话工具——基于Qwen3-0.6B-FP8模型的极速对话工具。它只有6亿参数&#xf…...

ST语言入门实战:从C语言到PLC控制的快速上手指南

ST语言实战:从C语言到工业控制的无缝迁移 如果你和我一样,是从C语言或者类似的通用编程语言领域转过来的,第一次接触ST语言时,可能会觉得既熟悉又陌生。熟悉的可能是那些IF、WHILE、:赋值符号,陌生的则是它运行的环境—…...

vue状态管理库vuex+pinia

文章目录vuexpiniavuex pinia...

为什么大多数 AI 失败,本质上是治理失败

过去几年,AI事故越来越多。AI聊天机器人输出违规内容推荐算法放大极端信息自动化系统做出错误决策AI客服给出危险建议很多公司把这些问题归结为:模型问题。但事实是:大多数 AI 失败,并不是模型失败。而是 治理失败。AI 失败的真实…...

【C++】一篇文章学会使用C++ 11 Lambda表达式

Lambda表达式的定义与设计初衷 什么是Lambda? Lambda是匿名函数(unnamed function),允许在代码中“就地定义、就地使用”,无需像普通函数那样先声明/定义再调用,也无需写函数对象(仿函数&#x…...

Source Han Serif CN:免费商用宋体的全方位应用指南

Source Han Serif CN:免费商用宋体的全方位应用指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在设计领域,选择一款合适的字体往往是提升作品质感的关键一…...

5个技巧解决美的智能设备局域网控制难题

5个技巧解决美的智能设备局域网控制难题 【免费下载链接】midea_ac_lan Auto-configure and then control your Midea M-Smart devices (Air conditioner, Fan, Water heater, Washer, etc) via local area network. 项目地址: https://gitcode.com/gh_mirrors/mi/midea_ac_l…...

HY-MT1.5-1.8B优化升级:量化压缩至900MB,树莓派也能流畅运行

HY-MT1.5-1.8B优化升级:量化压缩至900MB,树莓派也能流畅运行 最近在折腾边缘设备上的AI应用,发现一个挺有意思的现象:很多号称“轻量级”的模型,真放到树莓派或者手机上一跑,要么内存爆了,要么…...

Starry Night Art Gallery效果展示:超现实构图中空间透视精度

Starry Night Art Gallery效果展示:超现实构图中空间透视精度 1. 引言:当代码遇见星空 想象一下,你走进的不是一个软件界面,而是一座深夜的美术馆。四周是深邃的墨蓝色墙壁,交互按钮闪烁着温润的金色光泽&#xff0c…...