Node.js与MySQL交互操作及其注意事项


Posted in Javascript onOctober 05, 2016

node.js作为服务端的js运行环境已经出现了有几年了,最近我有个朋友也在做这方面的开发,但是也是刚刚接触,遇到了很多坑。前几天他们在操作数据库的时候出现了点问题,后来我们一起看了看,其实都是node本身机制的一些问题,这里总结一下给新手做借鉴。

我朋友的数据库采用的是MySQL。(至于为什么不用mongoDB,这个是公司上层选型的结果,因为很多新手朋友似乎总是觉的node.js就是应该和mongoDB联系在一起,所以这里简单说下)。我后来写了一个简单的小例子,整个小例子使用了express框架,node_modules里面已经下载好了express和ejs模板。先来看下目录:

Node.js与MySQL交互操作及其注意事项

server.js =》 node.js的服务器启动文件

db.js =》 数据库操作文件

views =》 存放模板文件,也就是所有的页面存放的地方

public =》 存放所有静态资源的地方,比如css js images之类的

首先介绍一下node.js连接MySQL的步骤,第一步,需要安装一个叫做MySQL的npm包,这个包是官方提供的,稳定性是可以保证的,当然,也还有其他的npm包,这里我们只使用mysql包。安装的方法很简单了,输入指令 npm install mysql --save,等待下载完成.

Node.js与MySQL交互操作及其注意事项

看到这个样子,那就是安装成功了。

然后我们打开db.js文件,在里面写入数据库中操作必须的一些代码,看下图:

Node.js与MySQL交互操作及其注意事项

代码很少,意思也很明显,第一步需要引入以mysql包,然后我们创建一个空对象,并且给他赋值一个叫query的方法,这个方法接受两个参数,第一个参数是你查询数据时候的sql语句,第二个参数是获取查询结果的回调函数。

再看函数内部,第一块代码是用来设置操作mysql的配置的:

Node.js与MySQL交互操作及其注意事项

host表示mysql安装的地址,因为我是本地的数据库,所以直接使用localhost

user表示mysql的用户名

password表示mysql的密码

database表示你要选择操作的具体的库的名字

port表示端口,可不填,默认就是3306

mysql.createConnection的返回值connection是我们接下来操作mysql的一个具体的对象,所有的操作方法都是基于他的。

调用connection的connect方法判断连接是否成功,如果失败,则把错误信息打印出来,并且停止运行。

Node.js与MySQL交互操作及其注意事项

调用connection的query方法来直接向数据库发送sql语句,并且把用回调函数返回结果,其中回调函数中有三个参数,第一参数是错误对象,如果操作失败,则会停止并打印错误信息,第二参数是具体的返回的结果,正常情况下是一个数组,里面包含很多json,第三个参数也是一个数组,里面包含着最每个数据的解释,比如当前数据属于哪个库,那张表等等。我们使用最多的自然是第二个参数了

Node.js与MySQL交互操作及其注意事项

当数据库操作结束以后关闭连接

Node.js与MySQL交互操作及其注意事项

整个过程很简单,只是其中有两个问题,第一个是数据库连接丢失的问题,不知道有没有人碰到过,第一次访问首页的时候,连接数据库正常,第二次访问首页,数据库连接不上了,会报错说连接丢失。这个原因是我们每操作完一次数据库就关闭了数据库连接,再次访问的时候就找不到连接了,但是连接又不能不关闭,有人可能觉得奇怪,每次访问首页时候都会访问db.js文件,不是每次都会有一个新连接产生吗?是的,只是我最开始的时候生成连接的那段代码并没有放到db.query的函数中,而是放在外面,如下图:

Node.js与MySQL交互操作及其注意事项

这样就导致连接只生成一次,关闭了以后,第二采访得不到连接。把它放在函数里面以后,使用exports对外暴露接口。每次访问首页,都会重新走一遍创建连接的过程,每次都能拿到一个新的连接,这样访问就没有问题了。其实项目中可以直接使用连接池。省去了很多麻烦。

第二个问题是我们在server.js中引入了db.js

Node.js与MySQL交互操作及其注意事项

此时大家可能看到了,mysql.query有两个参数,第一个是sql,第二个是回调函数,回调函数有一个result的参数,其实他就是数据库查询出来的结果。有人会说为什么不直接在db.js中使用return,把查询结果返回,搞什么回调啊!

Node.js与MySQL交互操作及其注意事项

其实这里就是node.js的异步造成的一些问题了,如果我们把server.js中的代码改成下图

Node.js与MySQL交互操作及其注意事项

因为我们看到了mysql包的query方法是异步操作,这就导致下面的res.render()方法不会等待他把结果查询出来以后再执行,往往是结果还没出来,就已经开始渲染页面,但是数据又没有得到,所以就会报错了。因此只好传送了一个回调函数进去,在mysql的query方法结束以后,把结果通过参数传入到我们自己写的回调函数中,这样我们就能在回调函数里得到结果了。然后再执行渲染。当然处理这个问题还可以引入第三方包 async来解决异步问题,具体看个人了。

Javascript 相关文章推荐
基于jQuery的一个扩展form序列化到json对象
Dec 09 Javascript
Extjs实现下拉菜单效果
Apr 01 Javascript
JavaScript实现显示函数调用堆栈的方法
Apr 21 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
Nov 04 Javascript
使用JS中的Replace()方法遇到的问题小结
Oct 20 Javascript
vue实现提示保存后退出的方法
Mar 15 Javascript
js replace 全局替换的操作方法
Jun 12 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
Nov 27 jQuery
JavaScript观察者模式原理与用法实例详解
Mar 10 Javascript
JS实现电脑虚拟键盘的操作
Jun 24 Javascript
vue打包npm run build时候界面报错的解决
Aug 13 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
Nov 09 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
Oct 04 #Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
Oct 04 #Javascript
总结Javascript中数组各种去重的方法
Oct 04 #Javascript
Javascript中arguments对象的详解与使用方法
Oct 04 #Javascript
js判断浏览器是否支持严格模式的方法
Oct 04 #Javascript
浅谈jquery高级方法描述与应用
Oct 04 #Javascript
vue.js中$watch的用法示例
Oct 04 #Javascript
You might like
一个用于MySQL的PHP XML类
2006/10/09 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
PHP使用json_encode函数时不转义中文的解决方法
2014/11/12 PHP
Zend Framework教程之资源(Resources)用法实例详解
2016/03/14 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
非常好用的JsonToString 方法 简单实例
2013/07/18 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
2016/08/01 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
js实现分页功能
2017/05/24 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
小程序实现上传视频功能
2020/08/18 Javascript
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
2018/07/11 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
Django-migrate报错问题解决方案
2020/04/21 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
Square Off美国/加拿大:世界上最聪明的国际象棋棋盘
2018/12/06 全球购物
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
2014年安全生产大检查方案
2014/05/13 职场文书
教育合作协议范本
2014/10/17 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
MySQL学习之基础命令实操总结
2022/03/19 MySQL