【H2O2|全栈】Node.js与MySQL连接
目录
前言
开篇语
准备工作
初始配置
创建连接池
操作数据库
封装方法
结束语
前言
开篇语
本节讲解如何使用Node.js实现与MySQL数据库的连接,并将该过程进行函数封装。
与基础部分的语法相比,ES6的语法进行了一些更加严谨的约束和优化,因此,在之后使用原生JS时,我们应该尽量使用ES6的语法进行代码编写。
准备工作
软件:【参考版本】Visual Studio Code,Postman或Apifox,Navicat Premium 16
插件(扩展包):Live Server
系统版本: Win10/11
提示:node.js在当前文件夹下使用cmd运行,不在浏览器解析运行
初始配置
当然,首先我们需要进行初始化得到package.json,这一步前几期已经反复提及,不再赘述。
然后,使用npm下载mysql包(记得在生产环境下),并进行导入。
我没有选择版本,配置文件中显示的版本是这个——
"dependencies": {
"mysql": "^2.18.1",
"nodemon": "^3.1.7"
}
我这里还下载了nodemon包,这样就不用编辑后反复关闭批处理程序了。
记得在scripts里面配置下面的启动语句(文件名自己起,省略后缀)——
"start": "nodemon 1.连接数据库"
最后,在我们的 1.连接数据库.js 中导入mysql包——
// 1.导入MySQL包
const mysql = require("mysql");
创建连接池
在node.js中创建一个连接池(Pool),用于连接指定地址下的指定数据库。
创建连接池的方法为createPool,它接收一个对象,该对象中有下面这些属性——
属性 | 作用 |
---|---|
host | 设置连接数据库的地址 |
port | 设置端口号,MySQL端口号为3306 |
user | 登录数据库的用户名 |
password | 登录数据库的密码 |
database | 使用的数据库,相当于MySQL中use的数据库 |
这里假设我们在本地有一个名为student的数据库,登录的用户名和密码(这个都要自己设置好哈)分别为root,123456, 那么就可以这么创建——
// 2.创建连接池
const pool = mysql.createPool({host: "127.0.0.1",port: 3306,user: "root",password: "123456",database: "student"
});
操作数据库
有了连接池之后,我们就可以利用query()方法,直接使用MySQL的语句。
比如,我们想要在student下创建一张t_students表,那么就可以先将建表的语句使用模板字符串保存起来——
const sql = `CREATE TABLE t_students (id int(11) UNSIGNED NOT NULL COMMENT '学号',name varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',age int(10) UNSIGNED NULL DEFAULT NULL COMMENT '年龄',score int(10) UNSIGNED NULL DEFAULT NULL COMMENT '分数',gender varchar(3) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '男' COMMENT '性别',comedate timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '入学时间',remark text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注',PRIMARY KEY (id) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
`
query()方法的形参列表为MySQL命令字符串和回调函数,就像下面这样——
pool.query(sql, (error, results, fields) => {})
在回调函数中,error是错误信息,通常由throw进行抛出,而results则是数据库操作的结果。
pool.query(sql, (error, results, fields) => {if (error) throw error;console.log(results);
})
至此,整个连接的基本步骤已经全部完成,下面在cmd中运行npm start,不出意外是可以看到类似下面的成功创建信息的——
使用Navicat Premium 16连接目标地址的数据库(这里是本地),打开student库,就可以看到我们刚刚创建好的t_students表——
对于其他的MySQL语句,只需要替换sql字符串的内容然后效仿即可。
注意,对于查询操作,查询的结果是一个RowDataPacket数组的形式。
我们可以使用JSON的stringify()方法进行转化,然后利用parse()方法进行解析,这样就可以把结果转化成我们熟悉的JSON对象数组的形式——
封装方法
纵观node.js操作MySQL的过程,其实还是比较固定的——无非就是创建连接池和操作数据库这两步。因此,我们可以将它们封装成一个方法。
首先,建立一个db文件夹,用于保存我们的数据库操作的js文件。connect.js用于连接池的创建,tools.js用于数据库的操作。
在connect中添加下面的代码——
// 1导入mysql包
const mysql = require("mysql")
// 2 创建连接池
const pool = mysql.createPool({host: "xxx.xxx.xxx.xxx",port: 3306,user: "xxx",password: "xxx",database: "xxx"
})module.exports = pool
这里的3360是固定的,而xxx需要根据使用者的不同替换成一些固定的代码,比如连接地址、固定用户名密码和指定数据库。
最后,使用module.exports进行匿名导出。
对于异步的数据库操作来说,可以使用Promise进行封装。
query()方法的回调函数接收error和results参数,对应Promise的rejected()和resolved()方法。
query()的第一个参数照例还是MySQL语句,但是我们还需要在该参数和回调函数之间插入一个sqlParams参数,该参数默认为空数组,代表需要查询的数据。
对于查询语句来说,实际上是将sql参数和sqlParams拼接起来的结果,那么,为什么不在sql参数中一次性传入完整的查询语句呢?
这里假设我们在进行一次登录校验操作,那么,我们的sql参数大致是下面这样——
const sql = `SELECT username, password FROM table_login WHERE username = 'admin' AND password = 123456
`
其中admin和123456是用户输入的值。
看上去这个校验没有任何问题,但是试想一种极端的情况,假设用户在密码框输入下面的信息——
123456 AND 1 = 1
那么我们的sql语句将会变成下面的样子——
const sql = `SELECT username, password FROM table_login WHERE username = 'admin' AND password = 123456 AND 1 = 1
`
这样的结果是非常危险的,只要用户名输入正确,那么无论密码是什么,整个语句都将显示为可以查询到,即可以登录。
所以为了避免这种情况,我们应该让输入信息和固定的sql语句分离。
那么,原sql语句可以改成这样——
const sql = `SELECT username, password FROM table_login WHERE username = ? AND password = ?
`
而用户名和密码则保存在sqlParams中,以数组的形式——
['admin', 123456]
由此就可以避免输入的安全性问题。
所以,tools中的代码如下——
// 导入链接
const connect = require("./connect")// MySQL操作
const execute = (sql, sqlParams = []) => {return new Promise((resolve, rejected) => {connect.query(sql, sqlParams, (error, results, fields) => {if (error) return rejected(error);resolve(JSON.parse(JSON.stringify(results)));});});
}module.exports = execute;
最后,依然是匿名导出execute()方法。
结束语
本期内容到此结束。关于本系列的其他博客,可以查看我的Node.js专栏和MySQL专栏。
在全栈领域,博主也只不过是一个普通的萌新而已。本系列的博客主要是记录一下自己学习的一些经历,然后把自己领悟到的一些东西总结一下,分享给大家。
文章全篇的操作过程都是笔者亲自操作完成的,一些定义性的文字加入了笔者自己的很多理解在里面,所以仅供参考。如果有说的不对的地方,还请谅解。
==期待与你在下一期博客中再次相遇==
——放了挺久的【H2O2】
相关文章:
【H2O2|全栈】Node.js与MySQL连接
目录 前言 开篇语 准备工作 初始配置 创建连接池 操作数据库 封装方法 结束语 前言 开篇语 本节讲解如何使用Node.js实现与MySQL数据库的连接,并将该过程进行函数封装。 与基础部分的语法相比,ES6的语法进行了一些更加严谨的约束和优化&#…...
【大数据技术基础】 课程 第3章 Hadoop的安装和使用 大数据基础编程、实验和案例教程(第2版)
第3章 Hadoop的安装和使用 3.1 Hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台,为用户提供了系统底层细节透明的分布式基础架构。Hadoop是基于Java语言开发的,具有很好的跨平台特性,并且可以部署在廉价的计算机集群中。H…...
DDR4与DDR3服务器内存的关键区别有哪些?
内存作为服务器性能的关键组件之一,已经经历了从DDR3到DDR4的过渡。DDR4内存相较于DDR3在多个方面有所提升,包括速度、带宽、功耗以及数据传输效率等。然而,尽管DDR4内存在性能上占有优势,DDR3内存依然在一些特定场景中得到了广泛…...
OceanBase 的探索与实践
作者:来自 vivo 互联网数据库团队- Xu Shaohui 本文总结了目前我们遇到的痛点问题并通过 OceanBase 的技术方案解决了这些痛点问题,完整的描述了 OceanBase 的实施落地,通过迁移到 OceanBase 实践案例中遇到的问题与解决方案让大家能更好的了…...
2024年安全员-A证证模拟考试题库及安全员-A证理论考试试题
2024年安全员-A证模拟考试题库及理论考试试题(一) 单选题 根据《建筑施工企业主要负责人、项目负责人和专职安全生产管理人员安全生产管理规定》,项目负责人每月带班生产时间不得少于本月施工时间的( )。 A. 60% B. …...
安装Docker并使用WSL
引言 Windows Subsystem for Linux (WSL) 是一个在Windows上运行Linux二进制可执行文件(ELF格式)的兼容层。它允许开发者直接在Windows上运行Linux环境,而无需使用虚拟机。Docker是一个开源的应用容器引擎,它允许开发者打包应用以…...
【TCP 网络通信(发送端 + 接收端)实例 —— Python】
TCP 网络通信(发送端 接收端)实例 —— Python 1. 引言2. 创建 TCP 服务器(接收端)2.1 代码示例:TCP 服务器2.2 代码解释: 3. 创建 TCP 客户端(发送端)3.1 代码示例:TCP…...
PostgreSQL和Oracle的sql差异
PostgreSQL和Oracle的sql差异 1.rownum (1)Oracle分页查询使用rownum,PostgreSQL使用limit offset ORACLEPOSTGRESQLselect * from (select rownum r,e.* from emp e where rownum <5) t where r>0;select * from emp limit 5 offset…...
阻塞队列详解
阻塞队列介绍 队列 是限定在一端进行插入,另一端进行删除的特殊线性表。先进先出(FIFO)线性表。允许出队的一端称为队头,允许入队的一端称为队尾。 数据结构演示网站: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html Q…...
kali安装谷歌输入法
临时隐匿你IP地址 ifconfig 查询kali现在所用ip ifconfig eth0 所需要修改的ip/掩码24 修改临时ip格式命令 安装中文输入法命令 临时隐匿你IP地址 ifconfig 查询kali现在所用ip ifconfig eth0 所需要修改的ip/掩码24 修改临时ip格式命令安装中文输入法命令 apt-get in…...
C语言:编译与链接
本篇博客给大家带来的是代码从运行到生成可执行文件的流程和原理 🐟🐟文章专栏:C语言 🚀🚀若有问题评论区下讨论,我会及时回答 ❤❤欢迎大家点赞、收藏、分享 你们的支持就是我创造的动力 今日思想…...
VTK编程指南<五>:VTK中的坐标系统、空间变换及VTK矩阵详解
1、坐标系统 计算机图形学里常用的坐标系统主要有 4 种,分别是 Model 坐标系统、World 坐标系统、View坐标系统和 Display坐标系统(这些名词在不同的书里的中文表述均有所差别,所以直接使用英文名词表示),此外还有两种表示坐标点的方式&#…...
Linux centos7 下载MySQL5.7仓库的命令
wget 是一个非常强大的命令行工具,用于从网络上下载文件。它是 Linux 和其他 Unix-like 系统中常用的工具之一。wget 命令的各个参数有着不同的含义,下面是您提供的命令 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.onarch.r…...
Java Serializable 序列化
Java的Serializable接口是Java序列化机制的核心,它允许一个对象的状态被转换为字节流,从而可以方便地进行存储或传输。 序列化后的对象可以被写到数据库、存储到文件系统,或者通过网络传输。 要在 Java 中使一个类可序列化,你需要…...
【QNX+Android虚拟化方案】136 - QNX 侧 Coredump 文件解析
【QNX+Android虚拟化方案】136 - QNX 侧 Coredump 文件解析 1. 初始化 QNX 开发环境2. 使用 gdb 解析 Coredump3. 查看 backtrace:bt4. 查看所有线程信息5. 打印线程19的回溯信息6. 打印所有线程的回溯信息7. gdb info 相关的指令8. 查看使用了哪些共享库9. 查看出错的行号及地…...
ORB-SLAM2 ---- 词袋模型BOW
文章目录 一、回环检测的重要性二、回环检测的方法三、词袋模型四、词典五、实例展示1. 计算评分2. 找出有相同单词的关键帧3. 用词袋进行快速匹配 六、总结 一、回环检测的重要性 在前面的学习我们知道,噪声的影响是不可消除的,而上一帧的误差不可避免的…...
win11无法检测到其他显示器-NVIDIA
https://www.nvidia.cn/software/nvidia-app/ https://cn.download.nvidia.cn/nvapp/client/11.0.1.163/NVIDIA_app_v11.0.1.163.exe 下载安装后,检测驱动、更新驱动。...
基于Java+Swing+Mysql的网络聊天室
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
docker安装Elasticsearch
公网即可拉取镜像,这个镜像是可以拉得到的,版本号根据自己需要的来 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.15运行命令,xxxxxxxxxxxxxxxxxxxxxxxx_password 为自己的密码 docker run -d --name elasticsearch \-…...
Elasticsearch入门之HTTP高级查询操作
前言 上一篇博客我们学习了es的一些基础操作如下: 创建索引(创建表 create table)查看索引(查看表show tables)查看单个索引(查看单个表show create table)删除索引(删除表&#x…...
前端知识1html
VScode一些快捷键 Ctrl/——注释 !——生成html框架元素 *n——生成n个标签 直接书写html的名字回车生成对应的标签 常见标签 span: <span style"color: red;">hello</span> <span>demo</span> span实现: 标题…...
《黑神话:悟空》闪退,提示D3D12崩溃,游戏崩溃无法启动是什么原因?要怎么解决?
《黑神话:悟空》闪退、D3D12崩溃及游戏无法启动:原因、解决方案与预防措施 作为一名软件开发从业者,我深知电脑游戏运行时可能遇到的各种问题,尤其是像《黑神话:悟空》这样的高品质游戏,其对硬件和系统配置…...
[GESP202312 五级] 烹饪问题
题目传送门 B3930 [GESP202312 五级] 烹饪问题 题目描述 有 N N N 种食材,编号从 0 0 0 至 N − 1 N-1 N−1,其中第 i i i 种食材的美味度为 a i a_i ai。 不同食材之间的组合可能产生奇妙的化学反应。具体来说,如果两种食材的美味…...
[代码随想录10]栈和队列
前言 栈和队列在STL中扮演的什么角色呢?我们知道STL的六大组件是:容器,适配器,算法,迭代器,空间配置器,仿函数,而我们今天要学的栈和队列就是属于适配器里面的,为什么栈和…...
TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面
前言 前篇文章使用Tesseract进行图片文字识别介绍了如何安装TesseractOCR与TesseractOCR的命令行使用。但在日常使用过程中,命令行使用还是不太方便的,因此今天介绍一下如何使用WPF/C#构建TesseractOCR简单易用的用户界面。 普通用户使用 参照上一篇教…...
Java、JavaWeb、数据库-图书管理系统
这一章主要是把上一章写在网页里的java 代码从网页中分离出来,放在专门的servlet类中。每一个servlet类对应一个数据库的表。 规范性问题: 1、dao包存放有关数据库的信息:BaseDao包就放数据库加载驱动和增删改和关闭资源;而其他…...
轻量化特征融合 | YOLOv8 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作
本改进已同步到Magic框架 摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不…...
U盘文件乱码:原因、恢复、预防与总结
U盘文件乱码现象解析 U盘作为我们日常生活中常用的便携式存储设备,时常会遭遇文件乱码的问题。这种乱码现象通常表现为文件名变成一堆无意义的字符,文件内容无法正常查看,甚至文件根本无法被打开。当我们在电脑上插入U盘,准备查看…...
OpenStack介绍
OpenStack概述 OpenStack是一个开源的云计算管理平台软件,主要用于构建和管理云计算环境。它允许企业或组织通过数据中心的物理服务器创建和管理虚拟机、存储资源和网络等云计算服务。其核心组件包括计算(Nova)、网络(Neutron)、存储(Cinder、Swift)等。这些组件相互协作…...
OpenGL编译用户着色器shader
shader相信很多朋友们都听说过,shader就是运行再GPU上的程序。虽然是这么说,但是我们发现,很多IDE开发工具比如说visual studio 没有办法直接去运行shader代码。这是因为,许多编译器不会自动将shader文件编译成可执行的代码然后发…...
C++ 已经知道,中序和后序,推算前序的方法。
已经知道,中序和后序,推算前序的方法。 #include<iostream> using namespace std; string ldr_str,lrd_str;//中序遍历和后序遍历 void build(int l1,int r1,int l2,int r2){if(l1>r1) return ;//边界条件,说明已经没有元素了cout<<lrd_s…...
unity打包到安卓帧率降低
这个问题遇到过很多次了我的做法就是直接设置Application.targetFrameRate60 参考...
计算机网络复习——概念强化作业
物理层负责网络通信的二进制传输 用于将MAC地址解析为IP地址的协议为RARP。 一个交换机接收到一帧,其目的地址在它的MAC地址表中查不到,交换机应该向除了来的端口外的所有其它端口转发。 关于ICMP协议,下面的论述中正确的是ICMP可传送IP通信过程中出现的错误信息。 在B类网络…...
DO、DTO、VO都是干什么的?
DO、DTO、VO 是三个常见的Java 对象,它们都是用来承载数据的,但是在不同的场景下有着不同的用途. 1.DO(Domain Object):领域对象,也称为实体对象。D0 通常用于数据库表的映射,DO中包含了实体的属性以及对实体的操作方法。DO 对应…...
深入探索 Node.js:构建强大的后端应用
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在…...
【Agent】构建智能诗歌创作系统:基于多 Agent 的协同创作实现
在探索大语言模型的创意应用过程中,我们开发了一个基于多 Agent 的智能诗歌创作系统。本文将介绍如何通过多个专业化的 Agent 协同工作,实现根据地点和天气信息自动创作诗歌的功能。 GitHub Code 项目地址 核心架构设计 1. Agent 基类设计 from pydan…...
【Git】:远程操作
目录 新建远程仓库 克隆远程仓库 向远程仓库推送 拉取远程仓库 配置 Git 忽略特殊文件 给命令配置别名 我们可以自己搭建⼀台运行 Git 的服务器,不过现阶段,为了学 Git 先搭个服务器绝对是小题大作。好在这个世界上有个叫 GitHub 的神奇的网站࿰…...
服务器数据恢复—LINUX下各文件系统删除/格式化的数据恢复可行性分析
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs࿰…...
基于python django的药材数据可视化系统的设计与实现,可对各类药材数据做一个统计分析可视化
研究背景 随着中医药文化的不断传承与发展,传统中药材的市场需求逐渐增加。然而,随着药材种类繁多、来源复杂、品质参差不齐,如何高效地管理、分析与展示中药材的相关数据,成为现代中药产业面临的重要课题。传统的药材数据管理方…...
docker及docker exec命令学习笔记
docker exec 是一个常用的 Docker 命令,允许你在已经运行的容器中执行命令或启动新的进程。以下是详细介绍和常见用法: 基本语法 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]参数详解 1. CONTAINER指定目标容器的名字或容器 ID。可以通过以下命…...
【pyspark学习从入门到精通24】机器学习库_7
目录 聚类 在出生数据集中寻找簇 主题挖掘 回归 聚类 聚类是机器学习中另一个重要的部分:在现实世界中,我们并不总是有目标特征的奢侈条件,因此我们需要回归到无监督学习的范式,在那里我们尝试在数据中发现模式。 在出生数据…...
Unity 策略游戏地图上的网格是如何实现的
在Unity中实现策略游戏地图上的网格,主要涉及到地图数据的处理、地图的加载与渲染、以及玩家在地图上的移动与碰撞检测等关键步骤。以下是对这些步骤的详细解释: 一、地图数据的处理 收集地图数据:这包括地形高度、地形纹理、建筑物、树木等…...
【MySQL 进阶之路】锁详解
MySQL 锁详解 1. 锁的基本概念 锁在数据库中是用来保证数据一致性和防止并发冲突的一种机制。MySQL 中的锁可以分为不同的类型和粒度,每种锁都有特定的使用场景和特点。了解锁的类型、作用以及如何避免锁带来的问题是提升数据库性能和避免数据冲突的关键。 2. 锁…...
RK3588--解码H264(mpp-dec-h264-to-yuv-file)
1. 简介 源码下载:https://download.csdn.net/download/mao0514/90096131 本例完成H264格式文件解码,并保存为yuv格式文件。参考mpp_dec_test重写,进行了一部分精简。 瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的 通用媒体…...
解决Conda虚拟环境中pip下载包总是到base环境的问题
conda本地创建的虚拟环境使用pip安装一些包总是安装到base环境中,导致无法正确进行环境隔离,下面是一些解决办法 方法一、使用python -m pip安装 1.1、验证虚拟环境的pip版本是哪个版本,如下所示,本人的demo虚拟环境直接使用pip…...
PyCharm 中设置虚拟环境
在 PyCharm 中设置虚拟环境的步骤如下: 1. 创建新项目时设置虚拟环境 1. 打开 PyCharm 并选择 New Project。 2. 在 Location 中指定项目路径。 3. 在右侧的 Python Interpreter 下,选择 New Environment。 Environment: 选择 Virtualenv。 Loca…...
M9484C VXG 矢量信号发生器- 110GHz-
M9484C VXG 矢量信号发生器 - 110GHz- M9484C VXG 是一款矢量信号发生器,在每个通道上提供 2.5 GHz 调制带宽,能够生成高达 54 GHz 的信号。 这款 VXG 矢量信号发生器可以组成经过校准和同步的全方位综合解决方案,帮助您更快测试下一代无线…...
机器学习详解(3):线性回归之代码详解
文章目录 1 数据预处理2 构建线性回归模型并绘制回归线初始化方法前向传播:forward_propagation代价函数:cost_function反向传播:backward_propagation参数更新:update_parameters训练方法:train代码运行结果 3 使用Py…...
工业检测基础-工业相机选型及应用场景
以下是一些常见的工业检测相机种类、检测原理、应用场景及选型依据: 2D相机 检测原理:基于二维图像捕获,通过分析图像的明暗、纹理、颜色等信息来检测物体的特征和缺陷.应用场景:广泛应用于平面工件的外观检测,如检测…...
标准状态下一个气体分子每秒平均碰撞次数的估算
要估算在标准状态(0C, 1个大气压)下,一个气体分子在1秒内与其他分子的碰撞次数,我们可以使用一些基本的物理和化学原理。这个过程涉及到气体动力学理论,特别是麦克斯韦-玻尔兹曼分布。 计算气体分子的平均速率…...