在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大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...
随机推荐
- bzoj 1495
这是一道...卡了我一个月的树形dp... 我真是太弱了... 其实仔细想想,这题的核心思路并不是特别复杂,但是的确存在不小的难度 作为一个看过全网基本所有题解+标程才弄明白这题到底怎么回事的蒟蒻,我 ...
- ps和AI使用过程中的易错点整理
ps:1.视图工具:1)标尺2)参考线3)网格:视图-->--显示>-->网格4)修改网格:编辑-->首选项>-->参考线.网格和切片 5)放大工具:画布中单击可放 ...
- MAC 调用GCC 提示xcrun: error: invalid active developer path
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: ...
- A.Ocean的礼物线段树
A: Ocean的礼物 Time Limit: 2 s Memory Limit: 128 MB Submit My Status Problem Description 皇家理工存在一段很神 ...
- file按钮美化成图片(纯HTML+CSS)
效果图: 代码实现: html: <div> <h2>上传头像</h2> <p class="fs18">(请上传200X200px ...
- git tag用法
git tag //查看tag git tag test_tag c809ddbf83939a89659e51dc2a5fe183af384233 //在某个commit 上打tag git tag. ...
- java线程间的通信方式
1.同步 synchronized 2.轮询 while volatile 3.wait/notify机制 syncrhoized加锁的线程的Object类的wait()/notify()/not ...
- java 使用jdbc连接Greenplum数据库和Postgresql数据库
1.公司使用的Greenplum和Postgresql,确实让我学到不少东西.简单将使用jdbc连接Greenplum和Postgresql数据库.由于使用maven仓库,不能下载Greenplum的 ...
- QQ登录用到的URL
//QQ 登陆页面的URL,client_id就是APP ID,会返回一个codehttps://graph.qq.com/oauth2.0/authorize?response_type=code& ...
- Morley's Theorem
题解: 计算几何基本操作 注意叉积的时候字母写的顺序 代码: #include <bits/stdc++.h> using namespace std; #define rint regi ...