关于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窗口, ...
随机推荐
- MySql数据库表操作(二)
一.增加表记录: insert [into] tab_name (field1,field2....) values (values1,values2....) , (values1,values2. ...
- 20145311王亦徐 《网络对抗技术》 MSF基础应用
20145311王亦徐 <网络对抗技术> MSF基础应用 实验内容 掌握metasploit的基本应用方式以及常用的三种攻击方式的思路 主动攻击,即对系统的攻击,不需要被攻击方配合,以ms ...
- Git pull的时候遇到问题
转载:https://www.jianshu.com/p/7b1c58e0a9ef 使用git从远程pull代码时报错: error: The following untracked working ...
- 【python37--面向对象】
一. self是什么 绑定方法,self就是实例对象的唯一标志 >>> class Ball: def setName(self,name): self.name = name de ...
- CentOS 使用 Docker 安装 Sentry
官网介绍:Sentry是一个实时事件日志记录和汇集的日志平台,其专注于错误监控,以及提取一切事后处理所需的信息.他基于Django开发,目的在于帮助开发人员从散落在多个不同服务器上的日志文件里提取发掘 ...
- CF 1087解题报告
cf解题报告 记录一下吧 做出:T1 rating :-97 想起几个月前做不出T1还是有点小搞笑呀2333 T1 双指针+特判 T2 发现k特别小,枚举剩余系 还要判断是否是能被n整除 移项发现可以 ...
- L2-001:dijskstra + 多条最短路径 + 记录中间路径
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 思路: dijkstra算出最短路 ...
- java 之 schema解析
一,schema约束 *dtd语法:<ELEMENT 元素名 约束> *schema符合xml的语法,xml语句 **一个xml中可以有多个schema,多个schema使用名称空间区分( ...
- nginx的高可用集群
1,阿里云:SLB 2, 硬件负载均衡器(如:F5,RedWare ) 3,软件实现高可用或负载均衡.keepalived
- (转)Understanding Memory in Deep Learning Systems: The Neuroscience, Psychology and Technology Perspectives
Understanding Memory in Deep Learning Systems: The Neuroscience, Psychology and Technology Perspecti ...