NodeJs实现对本地 mysql 数据库的增删改查

news2025/1/19 13:04:19
写在前面

今天我们接着写nodejs对数据库的操作,今天实现简单的增删改查,读之前请先移步到这里NodeJs 连接本地 mySql 数据库获取数据,避免后续一些代码出险阅读断层。

安装 nodemon
npm install nodemon

因为 nodejs 的服务是本地启动,避免后续频繁启动服务,安装 nodemon 可以帮助我们实现热重载 不安装也可以,手动重启就可以了。

整体文件结构如图

在这里插入图片描述

实现基础服务
/**
 * @author 是悟能了
 * @aim 实现基础服务
 * @fileName baseServer.js
 */

const express = require('express');
const bodyParser = require('body-parser');
const serve = express();
const port = 8000;

// TODO: 解析获取到的 json 数据
serve.use(bodyParser.urlencoded({
	extended: false
}));

serve.use(bodyParser.json());

serve.listen(port, () => {
	console.log(`serve is running...port = ${port}`);
});

module.exports = serve;


测试启动
nodemon baseBaseServer.js

在这里插入图片描述

实现基础数据库连接
/**
 * @author 是悟能了
 * @aim 链接 mysql 数据库
 * @fileName baseLinkData.js
 */

const mysql = require('mysql');
// TODO: 创建数据库链接
const db = mysql.createConnection({
	host: "localhost",
	user: "root",
	password: "**********", //自己的数据库链接密码
	database: "sys",
});

db.connect((err) => {
	if (err) {
		console.error('Error connecting to MySQL database:', err);
		return;
	}
	console.log('Connected to MySQL database success');
});

module.exports = db;
测试连接数据库
nodemon baseLinkDateBase.js

在这里插入图片描述

实现基础回调信息
// TODO: 回调信息
module.exports = (status, code, message, data = [] || {}) => {
	return JSON.stringify({
		status,
		code,
		message,
		data
	})
}
实现静态数据库表的管理
// 表明配置
const TABLES = {
	USERINFOS: 'userinfos'
}

module.exports = TABLES;
实现 CURD 功能
接口测试连通性
/**
 * @author 是悟能了
 * @aim 实现基础的 CURD
 */

const serve = require('./baseServer.js'); // 引入基础服务
const db = require('./baseLinkDateBase.js'); // 引入数据库链接
const TABLES = require('./TABLES.js'); // 引入 database - table
const errContent = require('./status.js'); // 引入回调信息

// TODO: 测试接口连通性
serve.get("/", (req, res) => {
	// res.status(403);
	res.send(errContent(200, 1001, '接口连通性成功'));
});
启动服务
nodemon handleDataBase.js 

在这里插入图片描述
在这里插入图片描述

查询所有数据
// TODO: 查询所有数据
serve.get("/api/v1/optionList", (req, res) => {
	const sql = `SELECT * FROM ${TABLES.USERINFOS}`;
	console.log(`当前执行SQL - ${sql}`);
	db.query(sql, (err, result) => {
		if (err) {
			res.status(500).send(errContent(500, 1009, '数据库访问失败'));
		} else {
			res.status(200).send(errContent(200, 1001, '查询成功', result));
		}
	})
});

在这里插入图片描述

新增一条数据
// TODO: 增加一条数据
serve.post("/api/v1/optionList", (req, res) => {
	const params = req.body;
	const sql = `INSERT INTO ${TABLES.USERINFOS}(name,age,gender) VALUES(?,?,?)`;
	const value = [params.name, params.age, params.gender];
	console.log(`当前执行SQL - ${sql} - ${params.name}`);
	db.query(sql, value, (err, result) => {
		if (err) {
			res.status(500).send(errContent(500, 1009, '新增失败'));
		} else {
			res.status(200).send(errContent(200, 1001, '新增成功'));
		}
	})
});

在这里插入图片描述

更新一条数据
// TODO: 更新一条数据
serve.put("/api/v1/optionList", (req, res) => {
	const params = req.body;
	const sql = `UPDATE ${TABLES.USERINFOS} SET gender = ? WHERE name = ?`;
	const value = ['women', params.name]
	console.log(`当前执行SQL - ${sql} - ${params.name}`);
	db.query(sql, value, (err, result) => {
		if (err) {
			res.status(500).send(errContent(500, 1009, '更新失败'));
		} else {
			res.status(200).send(errContent(200, 1001, '更新成功'));
		}
	})
});

在这里插入图片描述

删除一条数据
// TODO: 删除一条数据
serve.delete("/api/v1/optionList", (req, res) => {
	const params = req.body;
	const sql = `DELETE FROM ${TABLES.USERINFOS} WHERE name = ?`;
	const value = [params.name];
	console.log(`当前执行SQL - ${sql} - ${params.name}`);
	db.query(sql, value, (err, result) => {
		if (err) {
			res.status(500).send(errContent(500, 1009, '删除失败'));
		} else {
			res.status(200).send(errContent(200, 1001, '删除成功'));
		}
	})
});

在这里插入图片描述

根据条件查询
// TODO: 根据条件查询
serve.get("/api/v1/optionList/:name", (req, res) => {
	const params = req.params;
	console.log(`当前参数 - ${JSON.stringify(params)}`);
	const sql = `SELECT * FROM ${TABLES.USERINFOS} WHERE name = ?`;
	const value = [params.name];
	console.log(`当前执行SQL - ${sql}`);
	db.query(sql, value, (err, result) => {
		if (err) {
			res.status(500).send(errContent(500, 1009, '查询失败'));
		} else {
			res.status(200).send(errContent(200, 1001, '查询成功', result));
		}
	})
})

在这里插入图片描述

本地数据库截图

在这里插入图片描述

写在后面

以上就是关于 nodejs 对数据库表中的数据基本的操作,代码只是实现基础功能,没有进行封装,可以进行封装之后会更好用一些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1847893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据治理工程师CDGA备考心得、时间安排、题库资源

1.写在前面 之前做一些数据质量控制、元数据、主数据相关工作,一直忙于工作,没有去往考证的方面想,去年年底心血来潮就决定考一考,证多不压身嘛(也有部分学生向我咨询),资源在文章结尾&#xff…

图说SpringCloudStream消息驱动

SpringCloud Stream消息驱动实现原理 通过定义Binder绑定器作为中间层,实现了应用程序和消息中间件之间实现细节的隔离。通过向应用程序暴露统一的Channel通道,可以让应用程序不再需要考虑各种不同的消息中间件实现的兼容性问题。当需要升级消息中间件&a…

【软件测试入门】测试用例经典设计方法 — 因果图法

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、因果图设计测试用例的步骤 1、分析需求 阅读需求文档,如果User Case很复杂&am…

光大证券-放量恰是入市时:成交量择时初探

核心算法 1. 在熊市中,各成交量时序排名出现的频次基本随排名变小而单调增大;在牛市中,各成交量时序排名出现的频次基本随排名变小而单调减少;而在震荡市中,各成交量时序排名出现的频次两头大,中间小&…

C语言----C语言内存函数

1.memcpy--内存拷贝--使用和模拟实现 //memcpy基本格式: // 目标空间地址 原空间地址 被拷贝的字节个数 //void *memcpy(void * destination, const void * source,size_t num); //因为内存拷贝拷贝的数据有:整型数据、结构…

三丰云免费虚拟主机和免费云服务器评测

今天我要向大家推荐一款非常优秀的云服务提供商,那就是三丰云。三丰云提供了免费虚拟主机和免费云服务器,为用户提供了便捷高效的云计算服务。首先,让我们来看看三丰云的免费虚拟主机服务。三丰云的免费虚拟主机提供了稳定可靠的服务器资源&a…

【ClickHouse】副本、分片集群 (六)

副本 副本的目的主要是保障数据的高可用性,即使一台ClickHouse节点宕机,那么也可以从其他服务器获得相同的数据。 https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replication/ 副本写入流程 写入流程如图-18所示: 图-18 写…

信息系统项目管理师 | 信息系统安全技术

关注WX:CodingTechWork 信息安全概念 安全属性 秘密性:信息不被未授权者知晓。完整性:信息是正确的、真实的、未被篡改的、完整无缺。可用性:信息可以随时正常使用。 安全分层 设备安全 设备的稳定性:在一定时间…

Ascend C Add算子样例代码详解

核函数定义 核函数(Kernel Function)是Ascend C算子设备侧实现的入口。在核函数中,需要为在一个核上执行的代码规定要进行的数据访问和计算操作,当核函数被调用时,多个核都执行相同的核函数代码,具有相同的…

千年古城的味蕾传奇-平凉锅盔

在甘肃平凉这片古老而神秘的土地上,有一种美食历经岁月的洗礼,依然散发着独特的魅力,那便是平凉锅盔。平凉锅盔,那可是甘肃平凉的一张美食名片。它外表金黄,厚实饱满,就像一轮散发着诱人香气的金黄月亮。甘…

基于语音识别的智能电子病历(五)电子病历编辑器

前言 首先我们要明确一个概念:很多电子病历的编辑器,在输入文字的地方,有个麦克风按钮,点击一下,可以进行录音,然后识别的文字会自动输入到电子病历中,这种方式其实不能称为“基于语音识别的智…

【MySQL】 -- 事务

如果对表中的数据进行CRUD操作时,不加控制,会带来一些问题。 比如下面这种场景: 有一个tickets表,这个数据库被两个客户端机器A和B用时连接对此表进行操作。客户端A检查tickets表中还有一张票的时候,将票出售了&#x…

Aidlux 1.4 部署Nextcloud 2024.6实录 没成功

Aidux阉割版Debain10,坑很多,比如找不到实际的系统日志,有知道的大神吗? 1 Apache2安装 # 测试Apache2 sudo apt update && sudo apt upgrade sudo apt install apache2 -y80端口疑似被禁止只能换端口 rootlocalhost:/…

云计算技术高速发展,优势凸显

云计算是一种分布式计算技术,其特点是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序,并通过多部服务器组成的系统进行处理和分析这些小程序,最后将结果返回给用户。它融合了分布式计算、效用计算、负载均衡、并行计算、网络存储…

ctr/cvr预估之NFM模型

ctr/cvr预估之NFM模型 在数据驱动的广告和推荐系统中,准确预测用户的点击行为(Click-Through Rate, CTR)和转化行为(Conversion Rate, CVR)是提升营销效率和用户体验的关键。因子分解机(Factorization Mac…

RK3568技术笔记七 安装Ubuntu Linux

在新弹出的窗口中,单击“CD/DVD (SATA)”。如下图所示: 在右侧选择“使用ISO映像文件”。然后单击“浏览”,找到SAIL-RK3568开发板光盘->通用工具->虚拟机Ubuntu->ubuntu-18.04.4-desktop-amd64.iso。最后点击…

韩顺平0基础学java——第28天

p569-591 坦克大战!(绘图监听事件线程文件处理) 绘图 绘图原理 Component类提供了两个和绘图相关最重要的方法: 1. paint(Graphics g)绘制组件的外观 2. repaint()刷新组件的外观。 当组件第一次在屏幕显示的时候,程序会自动的调用paint()…

Dify知识库接入微信

Dify知识库接入微信 看到此文章,相信您已经搭建好了Dify知识库,还没有Dify知识库请先部署好后再来尝试将Dify接入微信 准备材料如下 搭建好的Dify知识库里的api接口和key24小时不关机的服务器一个 (推荐浪浪云的服务器简单方便)需要一个微信…

数学建模整数规划学习笔记

与线性规划的本质区别在于决策变量是否取整。 (1)分支定界法 若不考虑整数限制先求出相应松弛问题的最优解: 若松弛问题(线性规划)无解,则ILP(整数规划)无解。 若求得的松弛问题最…

校园任务平台系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,论坛管理,任务咨询管理,用户管理,基础数据管理 前台账户功能包括:系统首页,个人中心,任务资讯公告&#…