关于nodejs访问mysql的思考
nodejs要访问mysql数据库,首先必须要安装包mysql,命令:npm install mysql。安装成功后的访问数据库代码如下:
var mysql = require('mysql');
var options = {
host: '172.23.88.107',
port: 3306,
database: 'test',
user: 'root',
password: 'zdsoft'
};
var pool = mysql.createPool(options);
pool.getConnection(function (err, conn) {
if (err) {
console.log(err);//打印错误消息
} else {
conn.query("select * from student", null, function (err, results, fields) {
//释放连接
conn.release();
if (err) {
console.log(err);
} else {
console.log(results);//成功,打印结果集
}
})
}
});
ok,上面的代码经过测试是没有任何问题的,但是现在就有个问题了,我们每次访问数据库都写这么大一篇感觉太累了,于是我们想把公共的部分提取出来创建一个类,文件名为:sqlHelper.js。由于数据库访问是异步访问的,因此我们不能直接通过返回return的方式,因此就必须要使用回调函数,sqlHelper.js的代码如下:
var mysql = require('mysql');
var options = {
host: '172.23.88.107',
port: 3306,
database: 'test',
user: 'root',
password: 'zdsoft'
};
var pool = mysql.createPool(options);
exports.query = function (sql, vals, fn) {
pool.getConnection(function (err, conn) {
if (err) {
fn(new Error(err));
} else {
conn.query(sql, null, function (err, results, fields) {
//释放连接
conn.release();
if (err) {
fn(new Error(err));
} else {
fn(null, results, fields);
}
})
}
});
}
这样,我们在调用的时候直接传入fn这个回调函数即可,调用方法如下:
var mysql = require('./lib/sqlHelper.js');//sqlHelper.js文件在lib文件夹下面
var result = mysql.query("select * from student", null, function (err, results, fields) {
if (results) {
for (let index = 0; index < results.length; index++) {
console.log(results[index].name);
}
} else {
console.log("err,msg:" + err);
}
});
自此,我们也算是大功告成了。
================================================分割线===========================================================
然而,我们还有另外一种实现方式,就是通过Promise这个对象,通过Promise对象我们可以像编写同步程序一样去编写异步代码,从而不用去无限次的嵌套回调函数,sqlHelper.js修改如下:
var mysql = require('mysql');
var options = {
host: '172.23.88.107',
port: 3306,
database: 'test',
user: 'root',
password: 'zdsoft'
};
var pool = mysql.createPool(options);
exports.query = function (sql) {
return new Promise(function (resolve, reject) {
pool.getConnection(function (err, conn) {
if (err) {
reject(err);//让状态变为已失效,并把错误消息传递回去
} else {
conn.query(sql, null, function (err, results, fields) {
//释放连接
conn.release();
if (err) {
reject(err);
} else {
resolve(results, fields);//让状态变为已成功,并把成功数据传递回去
}
})
}
});
});
}
调用方法修改如下:
var mysql = require('./lib/sqlHelper.js');//sqlHelper.js文件在lib文件夹下面
var promise = mysql.query("select * from student");
promise.then(function (results, fields) {
for (let index = 0; index < results.length; index++) {
console.log(results[index].name);
}
}, function (err) {
console.log(err);
});
可以看到,我们已经没有使用回调函数了。
关于nodejs访问mysql的思考的更多相关文章
- 开源一个好用的nodejs访问mysql类库
一.背景问题 自nodejs诞生以来出现了一大批的web框架如express koa2 egg等等,前端可以不再依赖后端可以自己控制服务端的逻辑.原来的后端开发同学的阵地前端如今同样也写的风生水起,撸 ...
- nodejs 访问mysql
安装 $ npm install mysql 简介 这个一个mysql的nodejs版本的驱动,是用JavaScript来编写的.不需要编译 这儿有个例子来示范如何使用: var mysql = re ...
- java通过jdbc访问mysql,update数据返回值的思考
java通过jdbc访问mysql,update数据返回值的思考 先不说那么多,把Java代码贴出来吧. public static void main(String[] args) throws I ...
- rhel6.4 安装nodejs和Mysql DB服务
rhel6.4 安装nodejs和Mysql DB服务 安装好redhat6.4虚拟机后, 安装软件: # yum install gcc-c++ openssl-devel Loaded plugi ...
- 用Nodejs连接MySQL
转载,原地址:http://blog.fens.me/nodejs-mysql-intro/ 前言 MySQL是一款常用的开源数据库产品,通常也是免费数据库的首选.查了一下NPM列表,发现Nodejs ...
- NodeJS+Express+MySQL开发小记(2):服务器部署
http://borninsummer.com/2015/06/17/notes-on-developing-nodejs-webapp/ NodeJS+Express+MySQL开发小记(1)里讲过 ...
- vue+nodejs+express+mysql 建立一个在线网盘程序
vue+nodejs+express+mysql 建立一个在线网盘程序 目录 vue+nodejs+express+mysql 建立一个在线网盘程序 第一章 开发环境准备 1.1 开发所用工具简介 1 ...
- 转】用Nodejs连接MySQL
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! 用Nodejs连接MySQL 从零开始node ...
- 使用pm2启动nodejs+express+mysql管理系统步骤
背景: 由于个人兴趣,了解了一下nodejs+express+mysql项目.在项目搭建完成并开发完成并部署时,遇到一个尴尬的问题,就是后台的servive服务启动问题.日常开发时,打开2个cm窗口, ...
随机推荐
- Summarization of Tech Interviews
Summarization of Tech Interviews(技术面试总结) 手心网(2015) Q1. 解释一下 TCP/IP 协议之滑动窗口? 滑动窗口协议的维基:https://en.wik ...
- Atlas读写分离[高可用]
Atlas下载地址: https://github.com/Qihoo360/Atlas/releases Atlas是出于360的, 比mysql-proxy更稳定, 部署起来更方便. 环境: pr ...
- Android - Resource 之 Menu 小结
定义一个application的菜单,由MenuInflater召唤. 位置: res/menu/filename.xml 类型:指向Menu resource 文法: <?xml versio ...
- 20145326蔡馨熤《网络对抗》——MSF基础应用
20145326蔡馨熤<网络对抗>——MSF基础应用 实验后回答问题 用自己的话解释什么是exploit,payload,encode. exploit:起运输的作用,将数据传输到对方主机 ...
- IO流-基础
//创建输出流对象 FileWriter fw = new FileWriter("d:\\a.txt"); /* * 创建输出流对象做了哪些事情: * A:调用系统资源创建了一个 ...
- 复旦高等代数II(16级)每周一题
每周一题的说明 一.本学期高代II的每周一题面向16级的同学,将定期更新(一般每周的周末公布下一周的题目); 二.欢迎16级的同学通过微信或书面方式提供解答图片或纸质文件给我,优秀的解答可以分享给大家 ...
- Python3 tkinter基础 Label justify 多行字符串左对齐
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Python 解析 XML 文件生成 HTML
XML文件result.xml,内容如下: <ccm> <metric> <complexity>1</complexity> <unit> ...
- Nodejs学习笔记2
在linux中, 个人用户的文件, 通常是放在 自己的 家目录中的, root用户放在 /root中. root用户根其他普通用户不同, root用户是专门放在 /root目录中的, 而普通用户的文件 ...
- (转)Shiro学习
(二期)13.权限框架shiro讲解 [课程13]自定义Realm.xmind36.8KB [课程13]用户授权流程.xmind0.2MB [课程13]shiro简介.xmind0.3MB [课程13 ...