在本教程中,我们会向你先容如何利用 MySQL 模块 - 这是一个用 JavaScript 编写的运行在 Node.js 之上的 MySQL 驱动程序。我会向你阐明如何利用该模块连接到 MySQL 数据库,实行常规的 CRUD 操作,之后便是对存储的过程进行检讨,以及对用户的输入进行转义这些技能。
这个颇受欢迎的教程在 2017 年 11 月 07 日进行了更新。个中的修正包括将语法更新到了 ES6,办理了node-mysql 模块被重新命名的问题,增加了更多对初学者友好的笔墨解释,并在 ORM 上新增加了一个部分。
快速入门:如何在Node 中利用MySQL

大概你来这是便是为了找到一个快速的法门。如果你是想用尽可能少的韶光在 Node 中启动并运行 MySQL,我们能知足你的需求!
以下5个大略步骤见告你如何在 Node 中利用 MySQL:
创建一个新项目:mkdir mysql-test && cd mysql-test
创建一个 package.json 文件:npm init -y
安装mysql模块: npm install mysql –save
创建一个app.js文件并将下面的代码段复制进去。
运行该文件: 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?我很想听人说说这些库。请不才面的评论中见告我们你的想法、建议以及更正见地!
文章来源:开源中国
【灯塔大数据】微信"大众年夜众号先容:中国电信北京研究院通过整合电信自有数据、互联网数据和线下数据,创建了业内领先的“灯塔”大数据行业运用平台,致力于与行业互助伙伴共同打造大数据行业运用生态圈。目前我们面向市场研究、广告、汽车、金融、人力资源等诸多行业领域,供应零售研究、消费者研究、店铺选址、精准营销、泛义征信等做事,助力企业在大数据时期杨帆远航。
微信"大众年夜众号【灯塔大数据】关键字信息:
【人工智能】获取人工智能时期的发展思考 ppt
【半月刊】下载大数据瞭望半月刊
【网络安全】获取国民网络安全报告全文
【23个情由】下载《大数据让你愉快的23个情由》电子书
【思维导图】下载12种工具的获取办法
【 灯塔 】 查看更多关键字回答