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

Node.js 数据库 CRUD 项目示例

希望使用Nodejs操作数据库做CRUD,用deepseek实战搜索“使用Nodejs对数据库表做CRUD的项目例子”,找到了解决方案,如下图所示:

项目结构

nodejs-crud-example/
├── config/
│   └── db.js          # 数据库连接配置
├── controllers/
│   └── userController.js # 业务逻辑
├── models/
│   └── userModel.js   # 数据库操作
├── routes/
│   └── userRoutes.js  # 路由定义
├── app.js             # 应用入口
├── package.json
└── README.md

1. 初始化项目

mkdir nodejs-crud-example
cd nodejs-crud-example
npm init -y
npm install express mysql2 body-parser cors

 

2. 配置数据库连接 (config/db.js)

const mysql = require('mysql2/promise');const pool = mysql.createPool({host: 'localhost',user: 'root',password: 'yourpassword',database: 'testdb',waitForConnections: true,connectionLimit: 10,queueLimit: 0
});module.exports = pool;

3. 创建模型 (models/userModel.js)

const pool = require('../config/db');class User {static async getAll() {const [rows] = await pool.query('SELECT * FROM users');return rows;}static async getById(id) {const [rows] = await pool.query('SELECT * FROM users WHERE id = ?', [id]);return rows[0];}static async create(name, email) {const [result] = await pool.query('INSERT INTO users (name, email) VALUES (?, ?)',[name, email]);return { id: result.insertId, name, email };}static async update(id, name, email) {await pool.query('UPDATE users SET name = ?, email = ? WHERE id = ?',[name, email, id]);return { id, name, email };}static async delete(id) {await pool.query('DELETE FROM users WHERE id = ?', [id]);return true;}
}module.exports = User;

4. 创建控制器 (controllers/userController.js)

const User = require('../models/userModel');exports.getAllUsers = async (req, res) => {try {const users = await User.getAll();res.json(users);} catch (err) {res.status(500).json({ message: err.message });}
};exports.getUser = async (req, res) => {try {const user = await User.getById(req.params.id);if (!user) {return res.status(404).json({ message: 'User not found' });}res.json(user);} catch (err) {res.status(500).json({ message: err.message });}
};exports.createUser = async (req, res) => {try {const { name, email } = req.body;const newUser = await User.create(name, email);res.status(201).json(newUser);} catch (err) {res.status(400).json({ message: err.message });}
};exports.updateUser = async (req, res) => {try {const { name, email } = req.body;const updatedUser = await User.update(req.params.id, name, email);res.json(updatedUser);} catch (err) {res.status(400).json({ message: err.message });}
};exports.deleteUser = async (req, res) => {try {await User.delete(req.params.id);res.json({ message: 'User deleted successfully' });} catch (err) {res.status(500).json({ message: err.message });}
};

5. 创建路由 (routes/userRoutes.js)

const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');// CRUD 路由
router.get('/', userController.getAllUsers);
router.get('/:id', userController.getUser);
router.post('/', userController.createUser);
router.put('/:id', userController.updateUser);
router.delete('/:id', userController.deleteUser);module.exports = router;

6. 应用入口 (app.js)

const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const userRoutes = require('./routes/userRoutes');const app = express();// 中间件
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));// 路由
app.use('/api/users', userRoutes);// 错误处理
app.use((err, req, res, next) => {console.error(err.stack);res.status(500).json({ message: 'Something broke!' });
});// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {console.log(`Server is running on port ${PORT}`);
});

7. 创建数据库表

在 MySQL 中执行以下 SQL 创建 users 表:

CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

8. 测试 API

你可以使用 Postman 或 curl 测试这些端点:

  • 获取所有用户GET /api/users

  • 访问http://localhost:3000/api/users

  • 结果为:

  • 获取单个用户GET /api/users/1

  • 访问http://localhost:3000/api/users/1

  • 创建用户:

    在cmd窗口中执行
    
    curl -X POST -H "Content-Type: application/json" -d '{"name":"John Doe","email":"john@example.com"}' http://localhost:3000/api/users
  • 更新用户:

    在cmd窗口中执行
    
    curl -X PUT -H "Content-Type: application/json" -d '{"name":"John Updated","email":"john.new@example.com"}' http://localhost:3000/api/users/1
  • 删除用户DELETE /api/users/1

  • 在cmd窗口中执行

  • curl -X DELETE -H "Content-Type: application/json" http://localhost:3000/api/users/1

相关文章:

Node.js 数据库 CRUD 项目示例

希望使用Nodejs操作数据库做CRUD,用deepseek实战搜索“使用Nodejs对数据库表做CRUD的项目例子”,找到了解决方案,如下图所示: 项目结构 nodejs-crud-example/ ├── config/ │ └── db.js # 数据库连接配置 ├──…...

ESP8266/32作为AVR编程器(ISP programmer)的使用介绍

ESP8266作为AVR编程器( ISP programmer)的使用介绍 🌿ESP8266自带库例程:https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266AVRISP📍支持ESP8266/32的ESP_AVRISP其它开源工程(个人没有再去验证)&…...

union all几个常见问题及其解决方案

UNION ALL 是 SQL 中用于合并两个或多个 SELECT 语句结果集的操作符。与 UNION 不同,UNION ALL 不会去除重复的记录,它简单地将一个查询的结果附加到另一个查询的结果之后。尽管 UNION ALL 相对来说更高效(因为它不需要检查重复项&#xff09…...

21.C++11

1.列表初始化 1.1C11中的{} •C11以后想统⼀初始化⽅式,试图实现⼀切对象皆可⽤{}初始化,{}初始化也叫做列表初始化。 • 内置类型⽀持,⾃定义类型也⽀持,⾃定义类型本质是类型转换,中间会产⽣临时对象,最…...

【交叉编译】目标机编译安装对应依赖库总结

1、解压目标机交叉编译工具链 # 创建工具链存放目录(可选) sudo mkdir -p /opt/toolchain# 解压到目标路径(示例路径:/opt/toolchain) sudo tar -xzvf 目标主机编译工具链.tar.gz -C /opt/toolchain# 查看解压后的目录…...

Docker华为云创建私人镜像仓库

Docker华为云创建私人镜像仓库 在华为云官网的 产品 中搜索 容器镜像服务 : 或者在其他页面的搜索栏中搜索 容器镜像服务 : 进入到页面后,点击 创建组织 (华为云的镜像仓库称为组织): 设置组织名字后&…...

【15】数据结构之基于树的查找算法篇章

目录标题 二叉排序树 Binary Sort Tree二叉排序树的插入二叉树排序树的删除二叉排序树的查找二叉排序树的调试与代码集合 平衡二叉树-AV树平衡二叉树的平衡化旋转平衡二叉树的代码调试与代码集合 B树B树的查找B树的插入B树和B*树 二叉排序树 Binary Sort Tree 二叉…...

自定义类型之结构体

1.结构体类型概述 结构体类型是一种用户自定义的数据类型,用于将不同类型的数据组合成一个整体。在C语言中,结构体使用struct关键字定义,由一系列具有相同类型或不同类型的数据构成的数据集合,也称为结构。结构体中的数据在逻辑上…...

SGFormer:卫星-地面融合 3D 语义场景补全

论文介绍 题目:SGFormer: Satellite-Ground Fusion for 3D Semantic Scene Completion 会议:IEEE / CVF Computer Vision and Pattern Recognition Conference 论文:https://www.arxiv.org/abs/2503.16825 代码:https://githu…...

应急响应篇钓鱼攻击邮件与文件EML还原蠕虫分析线索定性处置封锁

钓鱼邮件的eml中会有 邮件服务器地址域名(发信人)发送的本地IP和主机名发送的内容以及附件 邮件钓鱼: 攻击者目的:通过发信人,附件,取得突破 定性钓鱼邮件 威胁情报,人工分析来源&#xff0c…...

利用纯JS开发浏览器小窗口移动广告小功能

效果展示 直接上代码 如果要用到vue项目里面&#xff0c;直接按照vue的写法改动就行&#xff0c;一般没有多大的问题&#xff0c;顶部的占位是我项目需求&#xff0c;你可以按照要求改动。 <!DOCTYPE html> <html> <head><meta charset"utf-8"…...

java Stream流

Stream流 双列集合无法直接使用stream流&#xff0c;可以通过keyset&#xff08;&#xff09;或enteyset转换为单列集合&#xff0c;再进行操作 1.单列集合 package mystream;import java.util.ArrayList; import java.util.Collections;public class StreamDemo1 {public sta…...

【实战中提升自己】 防火墙篇之VPX部署–L2TP over IPSEC

1 VPx部署【L2TP Over ipsec】 说明&#xff1a;在VPX上面&#xff0c;我们希望与分部建立VPX&#xff0c;保证与分部的财务部正常通信&#xff0c;另外还提供L2TP Over ISPEC功能&#xff0c;方便远程接入访问内部服务器等。当然我们也可以做详细的控制&#xff…...

贪心算法(20)(java)整数替换

给定一个正整数 n &#xff0c;你可以做如下操作&#xff1a; 如果 n 是偶数&#xff0c;则用 n / 2替换 n 。如果 n 是奇数&#xff0c;则可以用 n 1或n - 1替换 n 。 返回 n 变为 1 所需的 最小替换次数 。 示例 1&#xff1a; 输入&#xff1a;n 8 输出&#xff1a;3 解…...

实验二.单按键控制LED

1.实验任务 如图4.1所示:在P0.0端口上接一个发光二极管L1,按键按一下灯亮,在按一下灯灭。 2.电路原理图 3.系统板上硬件连线 把“单片机系统”区域中的P0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。 4.程序设计内容...

Ubuntu 常用命令行指令

1. 文件与目录操作 命令作用示例ls列出目录内容ls -l&#xff08;详细列表&#xff09;cd切换目录cd ~/Documentspwd显示当前目录路径pwdmkdir创建目录mkdir new_folderrm删除文件rm file.txtrm -r递归删除目录rm -r old_dircp复制文件cp file.txt backup/mv移动/重命名文件mv…...

Cribl 数据脱敏 -02 (附 测试数据)

先把实验的测试方向如下: Match Regex Replace Expression Example result <...

【项目管理】第16章 项目采购管理-- 知识点整理

项目管理-相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 &#xff08;一&#xff09;知识总览 项目管理知识域 知识点&#xff1a; &#xff08;项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域&#xff09; 对应&…...

根据关键字搜索日志内容,常用的Linux命令

在 Linux 中&#xff0c;根据关键字搜索日志内容是运维和开发的常见需求。以下是常用的命令及场景示例&#xff1a; 1. grep 基础搜索 (1) 简单关键字匹配 # 在文件中搜索包含 "error" 的行 grep "error" /var/log/nginx/error.log# 忽略大小写&#xff…...

数据结构(六)——红黑树及模拟实现

目录 前言 红黑树的概念及性质 红黑树的效率 红黑树的结构 红黑树的插入 变色不旋转 单旋变色 双旋变色 插入代码如下所示&#xff1a; 红黑树的查找 红黑树的验证 红黑树代码如下所示&#xff1a; 小结 前言 在前面的文章我们介绍了AVL这一棵完全二叉搜索树&…...

【Linux】基础 IO(文件描述符、重定向、缓冲区)

Linux 1.理解文件2.C文件接口1.打开 写文件2.读文件 简单实现cat命令3.输出信息到显示器的方式4.stdin、stdout、stderr5.打开文件的方式 3.系统接口 IO1.传递标志位2.open、close3.write、read 4.文件描述符1.是什么&#xff1f;2.分配规则3.重定向原理4.通过dup2系统调用重…...

记录一下远程调试 备忘

‌在进行远程调试时&#xff0c;目标主机不需要安装完整的编程环境‌(舍去重复安装)。可以使用Visual Studio的远程调试功能&#xff0c;或者使用gdb和gdbserver进行远程调试。 Visual Studio远程调试 ‌复制远程调试器文件夹‌&#xff1a;将Visual Studio安装目录下的remot…...

libevent服务器附带qt界面开发(附带源码)

本章是入门章节&#xff0c;讲解如何实现一个附带界面的服务器&#xff0c;后续会完善与优化 使用qt编译libevent源码演示视频qt的一些知识 1.主要功能有登录界面 2.基于libevent实现的服务器的业务功能 使用qt编译libevent 下载这个&#xff0c;其他版本也可以 主要是github上…...

MyISAM索引方案

在InnoDB中索引即数据&#xff0c;也就是聚簇索引的B树叶子节点已经包含了所有完整的用户记录&#xff0c;MyISAM的索引方案虽然也是树形结构&#xff0c;但是将索引和数据分开存储 将表中的记录按记录的插入顺序单独存储在一个文件中【数据文件】&#xff0c;这个文件不划分数…...

Windows 图形显示驱动开发-WDDM 1.2功能—WDDM 1.2 中的 Direct3D 功能和要求

一、架构演进与驱动模型 1.1 WDDM驱动模型的革命性升级 Windows 8引入的WDDM 1.2驱动模型在以下方面实现突破&#xff1a; 内存管理&#xff1a;采用统一虚拟地址空间&#xff08;UVA&#xff09;架构&#xff0c;使CPU和GPU可共享相同的指针地址空间。具体实现通过DXGK_DRI…...

深度解析 Vue 项目 Webpack 分包与合包 一文读懂

深度解析 Vue 项目 Webpack 分包与合包 一文读懂 文章目录 深度解析 Vue 项目 Webpack 分包与合包 一文读懂一、Webpack 打包机制深度解析1.1 模块化系统的本质1.2 Webpack 构建流程解析1.3 默认打包的问题分析 二、分包策略深度配置2.1 SplitChunksPlugin 核心配置2.2 精细化分…...

【ROS】map_server 地图的保存和加载

【ROS】map_server 地图的保存和加载 前言地图的保存地图的加载 前言 在 ROS 中&#xff0c;想要实现导航功能&#xff0c;首先需要一张已建好的地图。导航系统依赖这张地图进行路径规划、定位和障碍物避让等操作。本文将讲解在使用 gmapping 或 hector_mapping 建图后&#x…...

【计网】SSL/TLS核心原理

序言 在HTTP协议中&#xff0c;信息是明文传输的&#xff0c;因此为了通信安全就有了HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)协议。HTTPS也是一种超文本传送协议&#xff0c;在HTTP的基础上加入了SSL/TLS协议&#xff0c;SSL/TLS依靠证书来验证服务端的…...

sqli-labs靶场 less 11

文章目录 sqli-labs靶场less 11 POS联合注入 sqli-labs靶场 每道题都从以下模板讲解&#xff0c;并且每个步骤都有图片&#xff0c;清晰明了&#xff0c;便于复盘。 sql注入的基本步骤 注入点注入类型 字符型&#xff1a;判断闭合方式 &#xff08;‘、"、’、“”&…...

陕化之光(原创)

当城市在和周公化合 陕化的工装已与朝霞发生反应 工人先锋号已然吹响 陕化工人游走在工作的床层 钢铁森林间穿梭的身影 是沉默的催化剂 让冰冷的方程式 绽放出最活跃的分子温度 扳手与阀门对话时 塔林正在记录 关于电流与压力的学习笔记 每一次精确的调控 都是舞台上…...

【刷题2025】高级数据结构(并查集+优先队列+图论)

1.并查集 (1)基础理论 并查集是一种树形的数据结构,用于处理一些不相交集合的 合并 及 查询 问题。比如,可以用并查集判断一个森林中有几棵树、某个节点是否属于某棵树。 并查集由一个整形数组 pre[] 和两个函数 find() 、 join() 构成。 数组 pre[] 记录了每个点的前驱…...

数据库性能优化(sql优化)_分布式优化思路01_yxy

数据库性能优化_分布式优化思路01 1 分布式数据库的独特挑战2 分布式新增操作符介绍2.1 数据交换操作符(ESEND/ERECV):2.2 数据迭代操作符GI:3 核心优化策略(一)_分区裁剪优化3.1 普通分区裁剪3.2 动态分区裁剪1 分布式数据库的独特挑战 在分布式数据库系统中,核心为数据被…...

云服务器和物理服务器有什么区别

云服务器与物理服务器的核心区别在于资源分配方式、性能稳定性、成本结构、运维管理及 适用场景。以下是具体分析: 一、资源分配与架构差异 云服务器:基于虚拟化技术,将物理服务器集群分割为多个虚拟实例&#xff0c;资源由多个用户 共享&#xff0c;可根据需求弹性调整配置…...

FPGA-DDS技术的波形发生器

1.实验目的 1.1掌握直接数字频率合成&#xff08;DDS&#xff09;的基本原理及其实现方法。 1.2在DE2-115 FPGA开发板上设计一个可调频率的正弦波和方波发生器&#xff0c;频率范围10Hz~5MHz&#xff0c;最小分辨率小于1kHz。 1.3使用Quartus II进行仿真&#xff0c;并通过S…...

晶晨线刷工具下载及易错点说明:Key文件配置错误/mac剩余数为0解决方法

晶晨线刷工具下载及易错点说明&#xff1a;Key文件配置错误&#xff0f;mac剩余数为0解决方法 各种版本晶晨线刷工具下载&#xff1a; 晶晨线刷工具易出错点故障解决方法&#xff1a; 1、晶晨线刷工具加载固件的时候提示mac红字且剩余数为0的解决办法 很多同学可能会与遇到加…...

idea如何使用git

在 IntelliJ IDEA 中使用 Git 的详细步骤如下&#xff0c;分为配置、基础操作和高级功能&#xff0c;适合新手快速上手&#xff1a; ​一、配置 Git​ ​安装 Git​ 下载并安装 Git&#xff0c;安装时勾选“Add to PATH”。验证安装&#xff1a;终端输入 git --version 显示版本…...

python——学生管理系统

学生管理系统主要分为以下三个大类&#xff1a; 一、用户类&#xff08;User&#xff09;&#xff1a; 属性&#xff1a;用户名&#xff08;username&#xff09;、密码&#xff08;password&#xff09; 功能&#xff1a;注册&#xff08;register&#xff09;、登录&#…...

快速幂+公共父节点

# 快速幂 求&#xff1a;23的10000次幂&#xff0c;那么就是求23的5000次幂&#xff0c;因为2350*235023^100;所以可以遍历log(n)次 int res1; int tmp23; for(int i1;i<logn;i) {tmp*tmp; }显然&#xff0c;我们无法通过logn计算次数&#xff1b; 比如是非偶数的怎么计算呢…...

【差分隐私相关概念】瑞丽差分隐私(RDP)命题4

命题4的证明详解&#xff08;分情况讨论&#xff09; 背景与设定 机制&#xff1a; f : D → R f: \mathcal{D} \to \mathcal{R} f:D→R 是由 n n n 个 ϵ \epsilon ϵ-差分隐私机制自适应组合而成。相邻输入&#xff1a; D D D 和 D ′ D D′ 是相邻数据集。目标&#xf…...

Vue 人看 React useRef:它不只是替代 ref

如果你是从 Vue 转到 React 的开发者&#xff0c;初见 useRef 可能会想&#xff1a;这不就是 React 版的 ref 吗&#xff1f;但真相是 —— 它能做的&#xff0c;比你想象得多得多。 &#x1f440; Vue 人初见 useRef 在 Vue 中&#xff0c;ref 是我们访问 DOM 或响应式数据的…...

C++第三方库【JSON】nlohman/json

文章目录 优势使用API从文件中读取json从json文本创建json对象直接创建并操作json对象字符串 <> json对象文件流 <> json对象从迭代器读取像使用STL一样的访问STL容器转化为 json数组STL容器 转 json对象自定义类型转化为 json对象 限制 优势 直观的语法&#xff…...

从源码到实战:深度解析`rsync`增量同步机制与高级应用

从源码到实战&#xff1a;深度解析rsync增量同步机制与高级应用 #mermaid-svg-C1ZMwvhtq4iP4E8m {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-C1ZMwvhtq4iP4E8m .error-icon{fill:#552222;}#mermaid-svg-C1ZMwvht…...

数据库表设计五层分类系统表设计

文章目录 数据库表设计五层分类系统表设计代码思路详解类概述核心方法详解1. processString(String input) 方法2. createNo(String input, boolean peerNode) 方法3. isParent(String parentNo, String sonNo) 方法 编号系统设计使用场景推测代码特点可能的使用示例 NoProcess…...

Centos/RedHat 7.x服务器挂载ISCSI存储示例(无多路径非LVM)

客户让帮忙挂载个ISCSI存储&#xff0c;大概结构如下图所示&#xff1a; ISCSI存储为一台安装了truenas的X86服务器&#xff0c;提供存储服务的IP地址为10.16.0.1 服务器的ETH1网卡配置与10.16.0.1同段网络。 为了给客户做个简单培训&#xff0c;整理了一下操作步骤。下面是配…...

【android bluetooth 协议分析 21】【ble 介绍 2】【什么是IRK,是如何生成和传递的】

1. 什么是 IRK&#xff1f; IRK&#xff0c;全称 Identity Resolving Key&#xff08;身份解析密钥&#xff09;&#xff0c;是 BLE 设备用于生成和解析 Resolvable Private Address&#xff08;RPA&#xff09; 的密钥。 2. IRK 的生成和传递过程 IRK 是在 BLE 配对&#xf…...

4.14-4.15学习总结 IO流:缓冲流+转换流+序列化流+打印流+压缩流+Commons—io工具包+Hutool工具包

图片加密操作&#xff1a; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class test {public static void main(String[] args) throws IOException {FileInputStream fisnull;FileOutputStream fosnull;try{fisnew…...

Linux入门学习笔记

一、文件路径相关 相对路径与绝对路径 相对路径&#xff1a;是从当前工作目录开始表示文件或目录位置的路径。例如&#xff0c;当前在 /home/user 目录下&#xff0c;若要访问 user 目录下 test 文件夹中的 file.txt 文件&#xff0c;相对路径就是 test/file.txt 。它依赖于当…...

Redis适用场景

Redis适用场景 一、加速缓存二、会话管理三、排行榜和计数器四、消息队列五、实时分析六、分布式锁七、地理位置数据八、限流九、数据共享十、签到 一、加速缓存 Redis最常见的应用之一是作为缓存层&#xff0c;用于存储频繁访问的数据&#xff0c;从而减轻数据库的负载。 通过…...

# WPS打开新文档,“工具”菜单下是空白

WPS打开新文档&#xff0c;“工具”菜单下是空白 在 WPS 中打开新文档后 “工具” 菜单下空白&#xff0c;可能由多种原因导致&#xff0c;如下图&#xff1a; 下面分析并给出对应的解决办法&#xff1a; 一、 功能区显示设置问题 1、原因&#xff1a; WPS 的功能区显示可能…...

【软考-架构】13.3、架构复用-DSSA-ABSD

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 1、软件架构复用2、特定领域软件架构DSSADSSA的三个基本活动参与DSSA的四种角色人员建立DSSA的过程三层次模型 考试真题第一题第二题 3、基于架构的软件开发ABSD的软件开发…...