【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】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于人工智能的新中高考综合解决方案

1. 引言 近年来,随着人工智能技术的飞速发展,教育领域也迎来了深刻的变革。针对新中高考改革的需求,本解决方案集成了科大讯飞在人工智能领域的核心技术,旨在通过智能化手段提升教育教学效率与质量,助力学生全面发展。…

【Linux基础】yum 与 vim 的操作

目录 Linux 应用商店——yum yum和yum源是什么 关于镜像的简单理解 yum 的基本操作 yum的安装 yum install 命令 yum查看软件包 yum list 命令 yum的卸载 yum remove 命令 关于 rzsz 软件 安装 rzsz 软件: rz 命令 sz 命令 yum 源拓展 Linux 编辑器…

Elasticsearch数据迁移(快照)

1. 数据条件 一台原始es服务器(192.168.xx.xx),数据迁移后的目标服务器(10.2.xx.xx)。 2台服务器所处环境: centos7操作系统, elasticsearch-7.3.0。 2. 为原始es服务器数据创建快照 修改elas…

【MySQL】数据类型的注意点和应用

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

首次打开韦东山提供的Ubuntu-18.04镜像后,该做哪些事?

目录 01-测试有无网络02-配置最基本的嵌入式开发环境(安装tftp-nfs等)03-缩短关机强制结束进行时间04-关闭软件的自动更新05-未完待续... 01-测试有无网络 ping www.baidu.com 02-配置最基本的嵌入式开发环境(安装tftp-nfs等) 需要安装 tftp,nfs,vim …

2030. gitLab A仓同步到B仓

文章目录 1 A 仓库备份 到 B 仓库2 B 仓库修改main分支的权限 1 A 仓库备份 到 B 仓库 #!/bin/bash# 定义变量 REPO_DIR"/home/xhome/opt/git_sync/zz_xx_xx" # 替换为你的本地库A的实际路径 REMOTE_ORIGIN"http://192.168.1.66:8181/zzkj_software/zz_xx_xx.…

Python与C++混合编程的优化策略与实践

在现代软件开发中,混合编程已成为一种普遍的开发模式。这种模式能够充分发挥不同编程语言的优势,实现性能与开发效率的最佳平衡。本文将深入探讨Python和C混合编程的策略与实践经验。 混合编程就像建造一座现代化的大厦,C就像大厦的钢筋混凝…

【kettle】mysql数据抽取至kafka/消费kafka数据存入mysql

目录 一、mysql数据抽取至kafka1、表输入2、json output3、kafka producer4、启动转换,查看是否可以消费 二、消费kafka数据存入mysql1、Kafka consumer2、Get records from stream3、字段选择4、JSON input5、表输出 一、mysql数据抽取至kafka 1、表输入 点击新建…

INS风格户外风光旅拍人像自拍摄影Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 户外风光旅拍人像自拍摄影结合 Lightroom 调色,可以打造出令人惊艳的视觉效果。这种风格将自然风光与人像完美融合,强调色彩的和谐与氛围感的营造。 预设信息 调色风格:INS风格预设适合类型:人像,户外&…

【burp】burpsuite基础(八)

Burp Suite基础(八) 声明:该笔记为up主 泷羽的课程笔记,本节链接指路。 警告:本教程仅作学习用途,若有用于非法行为的,概不负责。 ip伪装 安装组件jython 下载好后,在burp中打开扩展…

《船舶物资与市场》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问:《船舶物资与市场》是不是核心期刊? 答:不是,是知网收录的正规学术期刊。 问:《船舶物资与市场》级别? 答:国家级。主管单位:中国船舶集团有限公司 主办单…

【电子通识】案例:USB Type-C USB 3.0线缆做直通连接器TX/RX反向

【电子通识】案例:连接器接线顺序评估为什么新人总是评估不到位?-CSDN博客这个文章的后续。最近在做一个工装项目,需要用到USB Type-C线缆做连接。 此前已经做好了线序规划,结果新人做成实物后发现有的USB Type-C线缆可用,有的不行。其中发现USB3.0的TX-RX信号与自己的板卡…

Antd X : 迅速搭建 AI 页面的解决方案

前言 随着 AI 热度的水涨船高,越来越多的 AI 应用如井喷式爆发,那么如何迅速搭建一个 AI 应用的美观高质量 Web 前端页面呢, Antd 团队给出了一个解决方案。 X Ant DesIgn XAI 体验新秩序Ant Design 团队匠心呈现 RICH 设计范式&#xff0…

自建服务器,数据安全有保障

在远程桌面工具的选择上,向日葵和TeamViewer功能强大,但都存在收费昂贵、依赖第三方服务器、数据隐私难以完全掌控等问题。相比之下,RustDesk 凭借开源免费、自建服务的特性脱颖而出!用户可以在自己的服务器上部署RustDesk服务端&…

[Collection与数据结构] 位图与布隆过滤器

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

php 系统函数 记录

PHP intval() 函数 PHP函数介绍—array_key_exists(): 检查数组中是否存在特定键名 如何使用PHP中的parse_url函数解析URL PHP is_array()函数详解,PHP判断是否为数组 PHP函数介绍:in_array()函数 strpos定义和用法 strpos() 函数查找字符串在另一字符串…

重生之我在异世界学编程之C语言:深入位段篇

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一 位段的基本使用(1…

2. 读取文件

题目4: 读取excel 文件2_1People,查看数据结构(行与列数,列名),观察数据内容(前3行与后3行) import pandas as pd# 题目4: 读取excel 文件2_1People,查看数据结构(行与列数,列名),观察数据内容(前3行与后3行) people pd.read_excel(2_1People.xlsx) print(people.shape) #…

【Mac】安装Gradle

1、说明 Gradle 运行依赖 JVM,需要先安装JDK,Gradle 与 JDK的版本对应参见:Java Compatibility IDEA的版本也是有要求Gradle版本的,二者版本对应关系参见:Third-Party Software and Licenses 本次 Gradle 安装版本为…

【人工智能基础06】人工神经网络(练习题):神经网络的计算、激活函数的选择与神经网络的退化

文章目录 1. 基于神经网络计算心理健康程度2. 添加激活函数的神经网络计算3. 使用神经网络预测小胖是否会变胖4. 激活函数选择的讨论5. 神经网络的设计6. 深度线性模型的表达能力线性模型7. 神经网络退化 主要讨论的内容 什么是人工神经网络,相关计算反向传播算法的…