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 相关文章推荐
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
Sep 26 Javascript
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
Apr 02 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
Apr 06 Javascript
jQuery插件windowScroll实现单屏滚动特效
Jul 14 Javascript
JavaScript+html5 canvas绘制的小人效果
Jan 27 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
Jun 22 Javascript
Javascript 基础---Ajax入门必看
Jul 06 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
Jan 05 Javascript
使用vue-router设置每个页面的title方法
Feb 11 Javascript
微信小程序基于高德地图查找位置并显示文字
Oct 30 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
Dec 17 Javascript
javascript设计模式之迭代器模式
Jan 30 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
无线电的诞生过程
2021/03/01 无线电
PHP+MYSQL的文章管理系统(一)
2006/10/09 PHP
使用jquery实现简单的ajax
2013/07/08 Javascript
IE6 hack for js 集锦
2014/09/23 Javascript
JS实现1000以内被3或5整除的数字之和
2016/02/18 Javascript
JavaScript 消息框效果【实现代码】
2016/04/27 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
vue自定义指令实现v-tap插件
2016/11/03 Javascript
vue拦截器Vue.http.interceptors.push使用详解
2017/04/22 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
vue中多路由表头吸顶实现的几种布局方式
2019/04/12 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
如何实现小程序与小程序之间的跳转
2020/11/04 Javascript
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
python实现排序算法
2014/02/14 Python
Hadoop中的Python框架的使用指南
2015/04/22 Python
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
Python实现图片识别加翻译功能
2019/12/26 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
出生医学证明样本
2014/01/17 职场文书
环保建议书400字
2014/05/14 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
小学重阳节活动总结
2015/03/24 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
python小程序之飘落的银杏
2021/04/17 Python
html5调用摄像头实例代码
2021/06/28 HTML / CSS
Python OpenCV超详细讲解基本功能
2022/04/02 Python