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

【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的语法进行了一些更加严谨的约束和优化&#…...

汽配行业数字化解决方案(一)

汽配行业数字化解决方案,是通过整合云计算、大数据、人工智能、物联网等先进技术,构建一个全面、高效、智能的数字化生态系统,以实现汽配供应链的全程可视化与智能化管理。该解决方案涵盖了从供应商管理、库存优化、订单处理、物流跟踪到客户…...

前端路径“@/“的使用和配置

环境:vitets 需要安装types/node npm install types/node --save-dev在tsconfig.json中添加 如果有tsconfig.app.json和tsconfig.node.json文件,则在app.json中添加 "compilerOptions": {"baseUrl":".","paths&q…...

动态规划子序列问题系列一>最长递增子序列

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int lengthOfLIS(int[] nums) {int n nums.length;int[] dp new int[n];int ret 1;//最坏情况为1//初始化for(int i 0; i < n; i) dp[i] 1;for(int i 1; i < n; i){for(int j 0; j < i-1; j)if(…...

链表头文件大更新!!!

引言 原文章:链表简介及自制链表操作头文件_自己写一个链表头文件-CSDN博客。 此次更新添加了更多功能&#xff0c;让改头文件更 人性化 。 安装教程见原文章。 介绍 linked_list.h 头文件 linked_list.h 是一个 C 头文件&#xff0c;定义了一个模板类 LinkedList&#xff…...

力扣3381.长度可被K整除的子数组的最大元素和

力扣3381.长度可被K整除的子数组的最大元素和 题目 题目解析及思路 题目要求返回一段长度为K的倍数的最大子数组和 同余前缀和 代码 class Solution { public:long long maxSubarraySum(vector<int>& nums, int k) {int n nums.size();vector<long long>…...

http.ServeMux多路复用器的设置

package mainimport ("fmt""net/http" )func first(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "多函数-first") }func second(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "多函数-second") }func ma…...

优化器与优化方法:在现代科学与工程中的应用

目录 ​编辑 优化器&#xff1a;机器学习中的参数调整 1. 梯度下降系列 2. 动量法&#xff08;Momentum&#xff09; 3. Adagrad 4. RMSprop 5. Adam 优化方法&#xff1a;寻找系统最优解 线性规划 非线性规划 凸优化 非凸优化 结论 在当今的科学和工程领域&#…...

笔记本外接显示屏没声音

1、笔记本正常有声音&#xff0c;但是外接显示屏后没有声音了怎么回事呢&#xff1f;原来外接显示屏后笔记本的声音输出会自动选择显示屏的音频输出&#xff0c;但是显示屏可能没有声音输出所以导致笔记本没有声音。 2、解决办法&#xff1a;打开笔记本设置&#xff0c;选择声…...

vue框架

Vue.js是一种用于构建用户界面的JavaScript框架。它是一个轻量级框架&#xff0c;被设计为逐渐采用的渐进式框架&#xff0c;可以与现有项目集成&#xff0c;也可以作为一个完整的单页应用程序框架使用。 Vue.js具有以下特点&#xff1a; 简单易学&#xff1a;Vue.js的API简单…...

Vue指令(一)--v-html、v-show、v-if、v-else、v-else-if、v-on、v-bind、v-for、v-model

目录 &#xff08;一&#xff09;初识指令和内容渲染指令v-html 1.v-html 案例&#xff1a; 官网的API文档 &#xff08;二&#xff09;条件渲染指令v-show和v-if 1. v-show 2. v-if &#xff08;三&#xff09;条件渲染指令v-else和v-else-if 案例 &#xff08;四…...

ElK 8 收集 MySQL 慢查询日志并通过 ElastAlert2 告警至飞书

文章目录 1. 说明2. 启个 mysql3. 设置慢查询4. filebeat 设置5. 触发慢查询6. MySQL 告警至飞书 1. 说明 elk 版本&#xff1a;8.15.0 2. 启个 mysql docker-compose.yml 中 mysql&#xff1a; mysql:# restart: alwaysimage: mysql:8.0.27# ports:# - "3306:3306&q…...

QT通过在线安装器安装【详细】

在线安装器地址&#xff1a; 官方在线安装器&#xff1a;Index of /official_releases/online_installers (qt.io) 通过命令行启动安装页面 直接双击qt安装程序&#xff0c;在线安装会非常慢&#xff0c;甚至安装失败&#xff0c;所以通过命令行页面启动安装页面。点击wind…...

34.1 uber开源的m3db简介

本节重点介绍 : m3db自己的定位m3db自己的架构m3db自己的组件 两句话简介 M3最初是在优步开发的&#xff0c;目的是提供对优步业务运营&#xff0c;微服务和基础架构的可视性由于M3具有轻松进行水平扩展的能力&#xff0c;因此它为所有监视用例提供了一个集中式存储解决方案…...

MATLAB 最小二乘点云拟合球 (89)

MATLAB 最小二乘点云拟合球 (89) 一、算法介绍二、算法实现1.代码2.结果这是缘,亦是最美的相见 一、算法介绍 球面拟合算法是一种通过数学方法将一组三维点(通常在三维空间中分布)拟合到一个理想的球形表面上。这个过程通常涉及使用最小二乘法来最小化实际数据点与拟合的…...

【Altium Designer 】AD如何使用嘉立创元器件的3D封装

1.下载3D封装 以STM32F407VGT6为例&#xff0c;进入嘉立创商城网站&#xff0c;找到需要的元器件封装 复制编号&#xff0c;打开嘉立创EDA&#xff0c;编译器选择专业版&#xff0c;新建工程&#xff0c;点击PCB1 复制编号在搜索框中&#xff0c;点击搜索&#xff0c;然后放置…...

G15沈海高速茶白高架自动化监测

1. 项目简介 G15 沈海高速公路北起辽宁省沈阳市苏家屯区金宝台枢纽&#xff0c;与沈阳市绕城高速公路&#xff08;国家高速 G1501&#xff09;相接&#xff0c;南至海南省海口市秀英区粤海枢纽&#xff0c;与海南地区环线高速公路&#xff08;国家高速 G98&#xff09;相交&am…...

网站从渗透到mssql提权全过程

2|0渗透全过程 1.信息收集-端口探测 1&#xff09;Nmap端口探测&#xff1a;namp -sS -p 1-65535 172.16.12.103 可以看到端口开放情况 2.判断系统情况 根据端口情况初步判定为IISmssql.net系统&#xff0c;访问web站点URL应该为&#xff1a;http:172.16.12.103:27689 访问…...

Qt多线程与QTimer详解

引用 Qt多线程中使用QTimer&#xff08;常见问题汇总&#xff09; [多线程]多线程使用QTimer Qt::ConnectionType&#xff1a;Qt不同类型connect的详细区别说明与应用 Qt的4种多线程实现方式 一文搞定之Qt多线程(QThread、moveToThread) QTimer The QTimer class provides repe…...

基于stm23的智慧宿舍系统 (DAY10)_小程序

好久没记录开发进度了&#xff0c;今天小程序差不多开发完了&#xff0c;UI这块算是比较常见了&#xff0c;主要功能是能连接onenet查看设备上传的数据&#xff0c;同时也能对设备进行一些控制下面是几个主要的函数&#xff0c;功能比较简单 wx.request({url: ${apiBaseUrl}/t…...

深入理解Spring事务

目录 什么是Spring事务为什么需要Spring事务Spring事务的实现 Spring事务的传播机制Spring事务的底层原理 EnableTransactionManagement --开启Spring管理事务Import(TransactionManagementConfigurationSelector.class) --提供两个beanAutoProxyRegistrar --启用AOP的功能&am…...

Ubuntu22.04深度学习环境安装【Anaconda+Pycharm】

anaconda可以提供多个独立的虚拟环境&#xff0c;方便我们学习深度学习&#xff08;比如复现论文&#xff09;&#xff1b; Pycharm编辑器可以高效的编写python代码&#xff0c;也是一个很不错的工具。 下面就记录下Ubuntu22.04的安装流程&#xff1a; 1.Anaconda安装 下载Ana…...

五、docker的网络模式

五、docker的网络模式 5.1 Docker的四种网络模式 当你安装docker时&#xff0c;它会自动创建三个网络&#xff0c;可使用如下命令查看&#xff1a; [rootlocalhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 7390284b02d6 bridge bridge lo…...

使用el-row和el-col混合table设计栅格化,实现表头自适应宽度,表格高度占位

演示效果&#xff1a; 如上图,由于地址信息很长,需要占多个格子,所以需要错开,若想实现这种混合效果,可以这样搭建: 页面效果&#xff1a; 代码分析: 上面使用el-row和el-col搭建表单显示 第一排三个8,第二排8和16 下面混合table实现&#xff0c;并使用border来自适应宽度…...

【服务器监控】grafana+Prometheus+node exporter详细部署文档

我们在进行测试时&#xff0c;不可能一直手动看着服务器的性能消耗&#xff0c;这时候就需要有个工具替我们监控服务器的性能消耗。这里记录下grafanaPrometheusnodeExporter的组合用于监控服务器。 简单介绍&#xff1a; grafana&#xff1a;看板工具&#xff0c;所有采集的…...

JavaScript中todolist操作--待办事项的添加 删除 完成功能

效果图 在文本框中输入内容点击添加按钮会在下面生成 添加功能 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…...

Windows中MySQL8.3.4 MSI版本——详细安装教程

一、下载MySQL安装文件。 下载地址&#xff1a;MySQL官网 进入后点击下面的MySQL社区版下载 点击MySQL Comunity Server。 我这里选择的是版本8.4.3LTS版本&#xff0c;在线对应的msi文件。 点击No thanks,直接下载。 二、安装MySQL 2.1、双击刚刚下载好的msi文件&#xff0c;…...

MySQL-DDL之数据库操作

文章目录 一. 创建数据库1. 直接创建数据库&#xff0c;如果存在则报错2. 如果数据库不存在则创建3. 创建数据库时设置字符集4. 栗子 二. 查看数据库1. 查看数据库 三. 删除数据库1. 删除数据库 四. 使用数据库1. 使用数据库2. 查看正在使用的数据库 数据定义语言&#xff1a;简…...

Python 笔记之进程通信

当需要创建的子进程数量不多时&#xff0c;可以直接利用multiprocessing中的Process动态生成多个进程 但是如果是上百个或者上千个目标&#xff0c;手动去创建进程的工作量很大&#xff0c;此时就可以利用到Multiprocessing模块提供的Pool方法 初始化pool时&#xff0c;可以指定…...

【Transformer序列预测】Pytorch中构建Transformer对序列进行预测源代码

Python&#xff0c;Pytorch中构建Transformer进行序列预测源程序。包含所有的源代码和数据&#xff0c;程序能够一键运行。此程序是完整的Transformer&#xff0c;即使用了Encoder、Decoder和Embedding所有模块。源程序是用jupyterLab所写&#xff0c;建议分块运行。也整理了.p…...