在Node.js使用Promise的方式操作Mysql
最近在学习Node.js,虽然早就听说了回调地狱结果过了一周就遇到了。所以花时间学习了了一下Promise。虽然还有Async/await、co、生成器等选择,但是因为本人基础较差,以及时间问题所以决定先用好Promise。
你可以选择用原生的,当然最好还是用BlueBird,听说性能比官方的好很多,而且有额外的特性:promisifyAll、
Promisify
官方案例:
var fs = Promise.promisifyAll(require("fs")); fs.readFileAsync("myfile.js", "utf8").then(function(contents) {
console.log(contents);
}).catch(function(e) {
console.error(e.stack);
});
首先如果要使用.then语句只能在Promise对象后面使用,于是乎你必须修改原始的连接代码,让他返回一个Promise对象。当然
使用的原始Mysql连接代码:
var mysql=require("mysql")
var settings=require('../settings');
var pool = mysql.createPool({
host: settings.host,
user: settings.user,
password: settings.password,
database: settings.db,
port:settings.port
}); module.exports=function(sql,callback){
pool.getConnection(function(err,conn){
if(err){
callback(err,null,null);
}else{
conn.query(sql,function(err,rows,fields){
//释放连接
conn.release();
//事件驱动回调
callback(err,rows,fields);
});
}
});
};
将下面这段代码改成:
module.exports=function (sql) {
return new Promise(function (resolve, reject) {
pool.getConnection(function(err,conn){
if(err){
reject(err);
}else{
conn.query(sql,function(err,rows,fields){
//释放连接
conn.release();
//传递Promise回调对象
resolve({"err":err,
"rows":rows,
"fields":fields});
});
}
});
});
};
这里解释一下一下reject与resolve这2个关键字:
reject:抛出一个异常,在最近的.catch()中接收并且处理他。
resolve:传递数据至下一个.then语句中。
这里我用resolve({"err":err,"rows":rows,"fields":fields}); 因为resolve不能传递多个对象,所以可以考虑数组或者组合成一个对象的。
使用案例:
var express = require('express');
var query=require('../module/mysql');
var JSON=require('JSON');
var router = express.Router(); router.post('/uploads/uploadFactoryInfo',function (req, res, next) {
var factoryName=req.body.factoryName;
var factoryAdress=req.body.factoryAdress;
var contactInfo=req.body.contactInfo;
var remark=req.body.remark;
var updateDate=req.body.updateDate;
var handleUserName=req.session.loginUser;
//判断厂家名是否重复,如果重复则返回错误信息
query("select * from managersystem.factoryinfo where factoryName='" +factoryName +"';").
then(function (data) {
if(data.rows[0]!=undefined)
{
res.json({message:'该厂家信息已经录入!'});
return;
}
}).then(function () {
query("INSERT INTO managersystem.factoryinfo (factoryName, infoUpdateTime, contactInfo, address, remark) " +
"VALUES ('"+factoryName+"', '"+updateDate+"', '"+contactInfo+"', '"+factoryAdress+"', '"+remark+"');");
}).then(function () {
query("select * from managersystem.factoryinfo where factoryName='" +factoryName +"';").
then(function (data) {
var sql = "INSERT INTO managersystem.useractionrecords (`handleUserName`, ` handleTableName`, ` handleTableId`, `oldData`, `newData`, `action`, `dateTime`) " +
"VALUES ('" + handleUserName + "', 'factoryinfo', '" + data.rows[0].id + "', null, '" + factoryName + "', '插入新数据', now());";
query(sql);
res.json({message:'插入数据成功!'});
})
}).catch(function (err) {console.log(err);});
});
使用Promise的感觉:
1、不用在每个回调函数中处理错误了,只需要在最后一个处理一下就好了,当然你可以在你想要处理的地方处理。
2、避免回调地狱,层层嵌套看得自己都恶心起来了。
在Node.js使用Promise的方式操作Mysql的更多相关文章
- 在Node.js使用Promise的方式操作Mysql(续)
在之后的开发中,为了做一些事务开发,我把mysql的连接代码从之前的query函数中分离出来了,直接使用原生的方法进行操作,但发现还是有点问题 原因是原生的node-mysql采用了回调函数的方式,同 ...
- Node.js文件系统、路径的操作详解
17173 17173 2 75 2014-12-12T05:06:00Z 2014-12-12T05:06:00Z 21 2735 15595 www.17173.com 129 36 18294 ...
- Node.js文件系统、路径的操作函数
Node.js文件系统.路径的操作函数 目录 Node.js文件系统.路径的操作函数 1.读取文件readFile函数 2.写文件 3.以追加方式写文件 4.打开文件 5.读文件,读取打开的文件内容到 ...
- Node.js初探之GET方式传输
Node.js初探之GET方式传输 例子:form用GET方法向后台传东西 html文件: <form action="http://localhost:8080/aaa" ...
- Node.js之Promise维护(同步)多个回调(异步)状态
金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉..NET程序员初用node.js最需要适应的就是异步开发, 全是异步,常规逻辑下遍历列表都是异步,如何保证 ...
- node.js的Promise库-bluebird示例
前两天公司一哥们写了一段node.js代码发给我,后面特意提了一句“写的不太优雅”.我知道,他意思是回调嵌套回调,因为当时比较急也就没有再纠结.然而内心中总记得要解决这个问题.解决node.js的回调 ...
- node.js cluster模式启用方式
众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心处理器 ...
- Node.js初探之POST方式传输
小知识:POST比GET传输的数据量大很多 POST发数据--"分段" 实例: 准备一个form.html文件: <!DOCTYPE html> <html> ...
- 性能追击:万字长文30+图揭秘8大主流服务器程序线程模型 | Node.js,Apache,Nginx,Netty,Redis,Tomcat,MySQL,Zuul
本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...
随机推荐
- OrCAD Capture CIS 16.6 快速地编辑Part的引脚名称
操作系统:Windows 10 x64 工具1:OrCAD Capture CIS 16.6-S062 (v16-6-112FF) 工具2:Excel 参考1:http://www.360doc.co ...
- python字典操作用法总结
基本语法: dict = {'ob1':'computer', 'ob2':'mouse', 'ob3':'printer'} 技巧: 字典中包含列表:dict={'yangrong':['23',' ...
- 支持向量机-SMO算法简化版
SMO:序列最小优化 SMO算法:将大优化问题分解为多个小优化问题来求解 SMO算法的目标是求出一系列的alpha和b,一旦求出这些alpha,就很容易计算出权重向量w,并得到分隔超平面 工作原理:每 ...
- loss函数学习笔记
一直对机器学习里的loss函数不太懂,这里做点笔记. 符号表示的含义,主要根据Andrew Ng的课程来的,\(m\)个样本,第\(i\)个样本为\(\vec x^{(i)}\),对应ground t ...
- Win8.1 查看 “Windows 体验指数“
啥是 Windows 体验指数 ? 引用MS的介绍: http://windows.microsoft.com/zh-cn/windows7/products/features/windows-exp ...
- ArcGIS 10开发迁移策略(待续)
1.更改 ESRI.ArcGIS.ADF 程序集 ArcGIS 10 中, ADF 程序集中的功能被分散到不同的程序集中,如果将 ArcGIS 9.3 下 开发的自定义组件迁移到 ArcGIS 10 ...
- django 文件下载
1. 最简单下载:将文件流放入HttpResponse对象即可,适合小文件的下载,但如果这个文件非常大,这种方式会占用大量. 如: def file_download(request): # do s ...
- POJ1273 USACO 4.2.1 Drainage Ditches CodeVS1993草地排水 网络流 最大流 SAP
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - POJ 传送门 - CodeVS 题意概括 给出一个图,告诉你边和容量,起点是1,汇点是n,让你求最大流. 题解 ...
- maven启动tomcat访问报404(url中没有项目名)
[INFO] Running war on http://localhost:8080/js_001(红色部分是项目名,要是没有的话是不能访问项目资源的) 但是我仍然不知道为什么有些maven项目却有 ...
- BeanFactory和FactoryBean的区别
转自:http://blog.csdn.net/wangbiao007/article/details/53183764 1.BeanFactory BeanFactory是IOC最基本的容器,负责生 ...