Node连接mysql数据库方法介绍


Posted in Javascript onFebruary 07, 2017

使用Node做Web开发,基本上都是使用NoSQL数据库,最频繁的就是使用MongoDB了,自己做了一些简单的Web开发,为了降低学习门槛,一直使用MySQL来做数据库。这里简单介绍一下连接MySQL数据库的方式,希望能帮助到其他人。

npm install --save mysql

使用上述命令安装完MySQL的模块后,就可以直接使用了,官网的DOCS里一个简单的例子如下就可以入门了。

var mysql = require('mysql');
var connection = mysql.createConnection({
 host: 'localhost',
 user: 'me',
 password : 'secret',
 database : 'my_db'
});
connection.connect();
connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
 if (err) throw err;
 console.log('The solution is: ', rows[0].solution);
});
connection.end();

很简单的一个例子,从上面的例子可以得出:使用createConnection(option)方法创建一个连接对象,然后连接对象的connect()方法创建连接,最后使用query()方法执行SQL语句,返回结果作为回调函数的参数rows返回,rows为数组类型。

1. 连接

创建连接对象,需要传入连接数据库的一些连接参数,也就是createConnection(option)里的option,option是一个对象,以键值对的形式传入createConnection()方法里。上例列举出了最基本的参数:

  • host 主机名
  • user 连接数据库的用户
  • password 密码
  • database 数据库名称

还有其他的参数,可以查询下官方DOCS,这里不一一列举了,初期学习上面这些参数就足以。

2. 关闭

关闭一个连接使用end()方法,end()方法提供一个回调函数,如下:

connect.end(function(err){
  console.log('End a connection');
});

这是建议使用的方法,end()方法会等待连接回调完成后才关闭连接。官方还提供了另外一种方法destroy()方法,这个方法直接关闭连接,不会等待回调完成。

举个简单的例子:

var mysql = require('mysql');
var option = require('./connect.js').option;
var conn = mysql.createConnection(option);
conn.query('select * from message',function(err,rows,fields){
 if(!err){
  console.log(rows);
 }
});
conn.end(function(err){
 console.log('end a connection');
});

最终结果会是:先打印完SELECT数据表结果后,再打印end a connection。而如果你将关闭方法换成conn.destroy();,那么你就别想返回任何结果了,因为还没等回调结束就已经终止连接了。

3. 连接池

连接池的原理是一开始就给你创建多个连接对象放在一个“池子”里,用的时候取一个,用完了放回“池子”里,在一定程度上是有利于节省系统开销的,因为连接对象是在最开始的时候就创建好了,使用的时候不再需要系统开销去创建数据库连接对象。官方DOCS介绍了连接方法:

var mysql = require('mysql');
var pool = mysql.createPool({
 connectionLimit : 10,
 host      : 'example.org',
 user      : 'bob',
 password    : 'secret',
 database    : 'my_db'
});
pool.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
 if (err) throw err;
 console.log('The solution is: ', rows[0].solution);
});

创建连接池的方法是createPool(option),option里多了一个参数connectionLimit指的是一次性在连接池里创建多少个连接对象,默认10个。如果你想共享一个连接对象,可以使用下面方法进行连接;

var mysql = require('mysql');
var pool = mysql.createPool({
 host   : 'example.org',
 user   : 'bob',
 password : 'secret',
 database : 'my_db'
});
pool.getConnection(function(err, connection) {
 // Use the connection
 connection.query( 'SELECT something FROM sometable', function(err, rows) {
  // And done with the connection.
  connection.release();
  // Don't use the connection here, it has been returned to the pool.
 });

// Use the connection
 connection.query( 'SELECT something2 FROM sometable2', function(err, rows) {
  // And done with the connection.
  connection.release();
  // Don't use the connection here, it has been returned to the pool.
 });
});

使用一个连接对象执行两次query()函数。

4. 示例1

使用基本的连接方式来连接数据库,分别定义数据连接以及关闭的function,如下示例:

// connect.js 数据库连接与关闭
var mysql = require('mysql');
var config = require('./config.json'); // 将数据库连接参数写入mysql对象,即config.mysql
var connCount = 0; // 统计目前未关闭的连接
exports.getConn = function(){
 connCount ++;
 console.log('............................OPEN a connection, has '+ connCount + ' connection.');
 return mysql.createConnection(config.mysql);
};
exports.endConn = function(conn){
 conn.end(function(err){
  if(!err){
   connCount --;
   console.log('.........................CLOSE a connection, has '+ connCount + ' connection.');
  }
 });
};

然后给个使用数据库的示例,

// db.js 查询用户信息
var connect = require('./connect.js'); // 引入数据连接方法
exports.getUser = function(username, callback){
  var connection = connect.getConn();
  var sql = 'select * from user where username = "' + username + '"';
  connection.query(sql,function(err,rows,fields){
    callback(err,rows,fields);  
  });
  connect.endConn(connection);
}

5. 示例2

使用数据库连接池,同样先创建数据库连接池的方法,如下两种方式:

// connect.js 直接使用
var mysql = require('mysql');
var config = require('./config.json');
var pool = mysql.createPool(config.mysql);

exports.querySQL = function(sql,callback){
  pool.query(sql, function(err,rows,fields){
    callback(err,rows,fields);
  });
}
// connect.js 使用getConnection方法
var mysql = require('mysql');
var config = require('./config.json');
var pool = mysql.createPool(config.mysql);

exports.querySQL = function(sql, callback){
  pool.getConnection(function(err,conn){
    conn.query(sql,function(err,rows,fields){
      callback(err,rows,fields); 
      conn.release();  // 不要忘了释放
    });    
  });
}

使用的时候,直接使用querySQL方法即可,如下:

// db.js 查询用户信息
var connect = require('./connect.js');
exports.getUser = function(username,callback){
  var sql = 'select * from user where username = "' + username + '"';
  connect.querySQL(sql,function(err,rows,fields){
    callback(err,rows,fields);    
  });
};

官方是推荐使用连接池的方式进行连接的,但是,是直接使用pool.query()连接还是pool.getConnection()的方法来连接,官方并没有介绍其优劣,我简单做了个测试,貌似这两种方式并没有多大的区别,也就没再研究,有知道的烦请告知,谢了~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 判断undefined的实现代码
Nov 26 Javascript
微博@符号的用户名提示效果。(想@到谁?)
Nov 05 Javascript
JS冒泡事件的快速解决方法
Dec 16 Javascript
jquery实现定时自动轮播特效
Dec 10 Javascript
通过隐藏iframe实现无刷新上传文件操作
Mar 16 Javascript
JavaScript 中的12种循环遍历方法【总结】
May 31 Javascript
详解关于element el-button使用$attrs的一个注意要点
Nov 09 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
Apr 20 Javascript
NUXT SSR初级入门笔记(小结)
Dec 16 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
Mar 12 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
May 19 jQuery
Javascript执行上下文顺序的深入讲解
Nov 04 Javascript
jQuery监听浏览器窗口大小的变化实例
Feb 07 #Javascript
Bootstrap table表格简单操作
Feb 07 #Javascript
Jquery根据浏览器窗口改变调整大小的方法
Feb 07 #Javascript
对比分析Django的Q查询及AngularJS的Datatables分页插件
Feb 07 #Javascript
jquery 判断是否支持Placeholder属性的方法
Feb 07 #Javascript
深入理解JavaScript中的for循环
Feb 07 #Javascript
vue实现ToDoList简单实例
Feb 07 #Javascript
You might like
PHP中创建并处理图象
2006/10/09 PHP
资料注册后发信小技巧
2006/10/09 PHP
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
PHP批量获取网页中所有固定种子链接的方法
2016/11/18 PHP
PHP页面跳转实现延时跳转的方法
2016/12/10 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
Laravel推荐使用的十个辅助函数
2019/05/10 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
javascript date格式化示例
2013/09/25 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
jquery实现加载更多"转圈圈"效果(示例代码)
2020/11/09 jQuery
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
python Django模板的使用方法
2016/01/14 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
毕业生个人求职的自我评价
2013/10/28 职场文书
英语专业学生个人求职信范文
2014/01/06 职场文书
公立医院改革实施方案
2014/03/14 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
2014幼儿园中班工作总结
2014/11/10 职场文书
应届生求职自荐信范文
2015/03/04 职场文书