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 相关文章推荐
JavaScript的目的分析
Jan 05 Javascript
javascript新手语法小结
Jun 15 Javascript
jquery pagination插件实现无刷新分页代码
Oct 13 Javascript
javascript 函数声明与函数表达式的区别介绍
Oct 05 Javascript
javascript屏蔽右键代码
May 15 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
Dec 31 Javascript
script标签属性用type还是language
Jan 21 Javascript
jQuery实现向下滑出的二级菜单效果实例
Aug 22 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
Sep 15 Javascript
基于jQuery实现复选框是否选中进行答题提示
Dec 10 Javascript
js判断某个字符出现的次数的简单实例
Jun 03 Javascript
vue组件tabbar使用方法详解
Nov 06 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
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
2016/04/14 PHP
JavaScript 事件参考手册
2008/12/24 Javascript
jQuery之按钮组件的深入解析
2013/06/19 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
Backbone.js框架中简单的View视图编写学习笔记
2016/02/14 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
Vue中Table组件Select的勾选和取消勾选事件详解
2019/03/19 Javascript
原生JS实现烟花效果
2020/03/10 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
举例详解Python中yield生成器的用法
2015/08/05 Python
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
python3中函数参数的四种简单用法
2018/07/09 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
Python中一个for循环循环多个变量的示例
2019/07/16 Python
Python实现FLV视频拼接功能
2020/01/21 Python
Python urllib3软件包的使用说明
2020/11/18 Python
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
酒店个人求职信范文
2014/01/25 职场文书
电子商务专业求职信
2014/03/08 职场文书
幼儿园家长评语大全
2014/04/16 职场文书
5s推行计划书
2014/05/06 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
网吧管理制度范本
2015/08/05 职场文书
Python Flask请求扩展与中间件相关知识总结
2021/06/11 Python
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL
vue 给数组添加新对象并赋值
2022/04/20 Vue.js