在Node.js中使用MySQL&MySQL JavaScript客户端

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介:

NoSQL 数据库最近一段时间都是很受追捧的,也许已经是 Node.js 应用程序的首选后端了。不过,你不应该只是根据潮流来选择拿什么技术构建下一个项目,使用什么数据库类型要取决于项目的特定需求。如果你的项目涉及到动态表的创建,实时的插入等等,那么 NoSQL 就是不错的技术路线,而另一方面,如果项目中要处理复杂的查询和事务,那么 SQL 数据库就更加合适了。

在本教程中,我们会向你介绍如何使用 MySQL 模块 - 这是一个用 JavaScript 编写的运行在 Node.js 之上的 MySQL 驱动程序。我会向你解释如何使用该模块连接到 MySQL 数据库,执行常规的 CRUD 操作,之后就是对存储的过程进行检查,以及对用户的输入进行转义这些技术。

这个颇受欢迎的教程在 2017 年 11 月 07 日进行了更新。其中的修改包括将语法更新到了 ES6,解决了node-mysql 模块被重新命名的问题,增加了更多对初学者友好的文字说明,并在 ORM 上新增加了一个部分。

快速入门:如何在Node 中使用MySQL

也许你来这是就是为了找到一个快速的法门。如果你是想用尽可能少的时间在 Node 中启动并运行 MySQL,我们能满足你的需求!

以下5个简单步骤告诉你如何在 Node 中使用 MySQL:

  1. 创建一个新项目:mkdir mysql-test && cd mysql-test
  2. 创建一个 package.json 文件:npm init -y
  3. 安装mysql模块: npm install mysql –save
  4. 创建一个app.js文件并将下面的代码段复制进去。
  5. 运行该文件: node app.js。会看到一条 “Connected!”(已连接上了)消息。 
 

安装 mysql 模块

现在让我们细化到第一步。首先,我们使用命令行创建一个新目录进进入这个目录。然后我们使用 npm init -y 命令创建 package.json 文件。-y 参数表示 npm 会使用默认值而不会问你各种问题。

这一步假设你已经在系统上安装了 Node 和 npm。如果还没安装,请阅读 SitePoint 上的这篇文章,它会指导你:使用 nvm 安装 Node.js 的多个版本。

然后,我们从 npm 安装 mysql 模块并将其保存为项目的依赖项。项目的 dependencies (相对于 dev-dependencies) 是运行程序所需要的包。你可以阅读了解两者的区别。

 

如果你深入学习使用 npm,可以阅读这个指南,或者在我们的论坛上提问。

入门

在我们连接到数据库之前,有一件重要的事情就是要在你的机器上安装和配置 MySQL。如果这件事情还没做完,那就看看软件主页上的安装说明自己去装一个吧。

接下来我们需要做的就是创建一个数据库和一个数据库表。你可以使用一个图形用户界面来做到这一点,比如说 phpMyAdmin,或者就使用命令行。 对于我们这篇文章,使用的是一个名为 sitepoint 的数据库和一个名为 employees 的表。如果你希望跟着一起操作的话,这里有一个数据库的转储文件,方便你可以快速地启动并运行起来:

连接到数据库

现在,我们在 mysql-test 目录下创建一个名为 app.js 的文件,来看看如何从 Node.js 连接到 MySQL。

现在打开一个终端并输入 node app.js。在连接成功建立之后,你应该能够在控制台中看到“Connection established”(连接已经建立好了)这条消息了。 如果出现了什么问题(例如输入了错误的密码),程序就会触发一个回调,该事件会传递出一个 JavaScript Error 对象(err)的实例。 你可以尝试将其打印到控制台以查看其中包含的有用信息以调试程序。

使用 Grunt 来监视文件的更改

每当我们对代码进行更改时,手动运行 node app.js 命令会变得有点乏味,所以让我们来把这个操作自动化吧。 这一节并不需要跟本教程的其余部分并没有依赖关系,不过如果照着做的话肯定会为你节省一些麻烦事儿。

我们首先得安装几个包:

Grunt 是有名的 JavaScript 任务执行程序,每当监听到有文件发生修改时,grunt-contrib-watch 都会运行已经预定义好的任务,并且会使用 grunt-execute 来运行 node app.js 命令。

安装完成之后,在项目根中创建一个名为Gruntfile.js的文件,然后在里面添加上如下代码。

现在运行 grunt watch 然后修改一下 app.js 文件。Grunt 就应该会检测到我们修改了文件并重新运行 node app.js 命令。

执行查询

读取

现在你知道如何在 Node.js 中建立 MySQL 连接了,再来看看如何执行 SQL 查询。我们从这里开始:建立使用 createConnection 命令连接到名为 sitepoint 的数据库。

连接建立后我们要使用连接变量来对数据库中的 employees 表进行查询。

现在运行 app.js (通过 grunt-watch 或者在终端输入 node app.js),你可以看到终端输出从数据库返回的数据。

从 MySQL 数据库返回的数据可以通过遍历 rows 对象来进行解析。

创建

你可以在数据库中执行 insert 查询,像这样:

请注意到我们是如何通过回调参数来获得刚插入那条记录的 ID 的。

更新

类似地,在执行 update 查询的时候,通过 result.affectedRows 可得到受影响的行数:

删除

delete 查询的操作也差不多:

高级用法

我希望有办法通过 mysql 模块来处理存储过程,以及转义用户输入。

存储过程

简单的说,存储过程是存储在数据库中,可以由数据库引擎和连接上数据的程序语言调用的程序(例如,SQL 程序)。如果你需要复习,请看看这篇不错的文章。

先来为我们的 sitepoint 数据库创建一个存储过程,它用于获取所有员工的详情。我们把它命名为 sp_getall。为了做这件事,你需要某种数据库接操作界面。我使用 phpMyAdmin。在 sitepoint 数据库中运行下面的查询:

它会将程序保存在 information_schema 数据库的 ROUTINGS 表中。

下一步,建立连接并使用连接对象调用存储过程,像这样:

保存修改并运行。运行的时候你可以看到从数据库返回的数据。

这些数据包括一些附加信息,比如影响的行数,insertId 等。你需要对返回数据的第 0 个元素进行遍历以获取员工详情信息。

现在考虑一个需要输入参数的存储过程。

我们可以在调用存储过程的时候传入参数:

多数时候,如果我们想在数据库中插入一条记录,需要将插入记录的 ID 作为输出参数返回出来。考虑接下来用于插入数据的存储过程,它有一个输出参数:

为了调用含有输出参数的存储过程,我们需要在创建连接时调用多个程序。因此,修改连接,设置执行多个语句为 true。

然后在调用存储过程的时候,设置并传入一个输出参数。

在上面的代码中,我们设置了输出参数 @employee_id 并在调用存储过程的时候将其传入。一旦调用完成,我们需要使用 select 查询输出参数来获取返回的 ID。

运行 app.js。如果执行成功你可以看到 select 查询的输出参数和各种其它信息。通过 rows[2] 可获得输出参数的值。

转义用户输入

为了避免 SQL 注入攻击,你应该总是转义来自用户的任何数据,然后再把它用于 SQL 查询。来演示一下为什么:

这看起来并没有什么问题,它会返回正确的结果:

不过,如果我们将 userLandVariable 改为:

居然访问了整个数据集。如果我们再改为这样:

这下麻烦大了!

好消息是有办法处理这类问题。你只需要使用 mysql.escape 方法:

或者使用问号占位符,就像我们在文章一开始提到的那个示例一样:

为什么不简单地使用 ORM?

你可能注意到了,评论中有人建议使用 ORM。在详述这个方法的优缺点之前,我先看看 ORM 是什么。下面是来自 Stack Overflow 的回答。

对象关系映射(Object-Relational Mapping, ORM) 是一种允许人们使用面向对象范型来查询和操作数据库数据的技术。在谈到 ORM 的时候,多数人是指实现了 ORM 技术的某个库,所以会使用 “an ORM” 这样的短语。

因此,这种方法基本上意味着你会使用 ORM 领域相关的语言来编写数据库逻辑,而不是我们一直在讨论的普通方法。下面以 Sequelize 为例:

对比:

使用 ORM 对你是否有意义,取决于很多与你工作相关的因素,比如你在做什么以及为谁做。一方面,ORM 的形式使开发更为高效,从某种程序上来说,它抽象了大部分的 SQL 因而不需要团队中的每个人都去了解如何编写高效的数据库查询。它也很容易迁移到不同的数据库软件,因为你是在抽象层次上进行开发。

然而,从另一方面来说,由于不理解 ORM 是如何做的,所以可能会编写出一些混乱和低效的 SQL。性能也会是一个大问题,毕竟优化不通过 ORM 的查询要容易得多。

到底采用哪一种方法,决定权在你,但是如果正在做这个决定,请看看这个 Stack Overflow 的帖子:为什么应该使用 ORM?,以及 SitePoint 上的:你可能不知道的 3 个 JavaScript ORM。

小结

本教程中只涉及到了 MySQL 客户端的皮毛。我推荐你去阅读官方文档以了解更详细的信息。当然也有别的选择,比如 node-mysql2 和 node-mysql-libmysqlclient。

你是否已经在 Node.js 中用过这些库来连接到 MySQL?我很想听人说说这些库。请在下面的评论中告诉我们你的想法、建议以及更正意见!


作者:OSC-协作翻译

来源:51CTO

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
关系型数据库 MySQL 网络安全
【YashanDB知识库】如何使用MySQL客户端链接YashanDB
【YashanDB知识库】如何使用MySQL客户端链接YashanDB
【YashanDB知识库】如何使用MySQL客户端链接YashanDB
|
7月前
|
JavaScript 前端开发 安全
【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 JS 逻辑。
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
563 1
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
511 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
安全 关系型数据库 MySQL
CentOS7仅安装部署MySQL80客户端
通过上述步骤,你可以在CentOS 7上成功安装并配置MySQL 8.0客户端。这个过程确保你能够使用MySQL客户端工具连接和管理远程的MySQL数据库,而不需要在本地安装MySQL服务器。定期更新MySQL客户端可以确保你使用的是最新的功能和安全修复。
1354 16
|
SQL 关系型数据库 MySQL
MySQL操作利器大公开!这几款客户端让你事半功倍
本文介绍了多种MySQL数据库管理工具,包括命令行工具、图形化用户界面(GUI)工具和Web界面工具。主要工具有: 1. **Navicat for MySQL**:功能强大,支持多种数据库管理任务,但需付费。 2. **DBeaver**:开源免费,支持多种数据库,安装包较大。 3. **MySQL Workbench**:官方提供的图形化工具,适合MySQL全家桶用户。 4. **HeidiSQL**:轻量级Windows客户端,简单易用。 5. **phpMyAdmin**:基于Web的管理工具,易于部署和使用。 6. **SQLyog**:适用于Windows,功能丰富,有免费
2618 3
|
存储 JavaScript NoSQL
Node.js新作《循序渐进Node.js企业级开发实践》简介
《循序渐进Node.js企业级开发实践》由清华大学出版社出版,基于Node.js 22.3.0编写,包含26个实战案例和43个上机练习,旨在帮助读者从基础到进阶全面掌握Node.js技术,适用于初学者、进阶开发者及全栈工程师。
316 9
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API
使用JavaScript和Node.js构建简单的RESTful API
|
开发框架 JavaScript 前端开发
Node.js日记:客户端和服务端介绍、Node.js介绍
Node.js日记:客户端和服务端介绍、Node.js介绍
|
JavaScript 前端开发 开发工具
Node.js——初识Node.js
Node.js——初识Node.js
244 4

推荐镜像

更多