在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、避免回调地狱,层层嵌套看得自己都恶心起来了。

时间: 2024-08-03 07:52:56

在Node.js使用Promise的方式操作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 14.00 Clean Clean false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-r

Node.js读写中文内容文件操作

由于Node.js仅支持如下编码:utf8, ucs2, ascii, binary, base64, hex,并不支持中文GBK或GB2312之类的编码, 因此如果要读写中文内容,必须要用额外的模块:iconv-lite 注:Node的iconv模块,仅支持linux,不支持Windows,因此要用纯js的iconv-lite,另:作者说iconv-lite的性能更好,具体参考git站点:iconv-lite 注2:我在测试读写文件时,始终无法把中文写入文件,一直乱码,读取正常,后来同事帮我发

Ubuntu14.04 搭建 node.js 环境(Binaries方式)

从官网下载 http://nodejs.org/download/ Linux Binaries (.tar.gz)  下载下来的是node-v0.10.29-linux-x64.tar.gz文件 解压 $ tar zxvf node-v0.10.29-linux-x64.tar.gz /etc/profile.d/下建立 node.sh文件 export NODEHOME=/home/username/Software/node #指定你的解压后Binaries文件路径 export PATH

Node.js文件系统、路径的操作函数

目录 1.读取文件readFile函数 2.写文件 3.以追加方式写文件 4.打开文件 5.读文件,读取打开的文件内容到缓冲区中: 6.写文件,将缓冲区内数据写入使用fs.open打开的文件 7.刷新缓存区; 8.创建目录; 9.读取目录; 10.查看文件与目录的信息; 11.查看文件与目录的是否存在 12.修改文件访问时间与修改时间 13.修改文件或目录的操作权限 14.移动/重命名文件或目录 15.删除空目录 16.监视文件 17.取消监视文件 18.文件流 19.创建读取流 20.创建写入

node.js的Promise库-bluebird示例

前两天公司一哥们写了一段node.js代码发给我,后面特意提了一句“写的不太优雅”.我知道,他意思是回调嵌套回调,因为当时比较急也就没有再纠结.然而内心中总记得要解决这个问题.解决node.js的回调金字塔问题有较多方法,在<深入浅出node.js>这本书中介绍了好几种,有事件发布/订阅模式.Promise模式.async库等.其中Promise模式被很多人推崇,实现的库有很多,本着从众的原则,闭着眼睛选个bluebird吧. 然而bluebird的文档并不咋滴,相当不咋滴!网上的例子基本上都

Node.js之Promise维护(同步)多个回调(异步)状态

金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉..NET程序员初用node.js最需要适应的就是异步开发, 全是异步,常规逻辑下遍历列表都是异步,如何保证列表遍历执行完毕?Promise帮你搞定!金天微信:15998603918 欢迎找我聊聊天. Node.js编程,清一色的回调. 如果没有Promise, 一连串的业务逻辑,从第一步回调到最后一步,“单线程逻辑”还搞的定,遭遇“多线程逻辑”,便陷入回调地狱. 自从有了Promise, 一切都不在是问

node.js中文件读取方式中流方式

1.node.js中文件读取流方式: var fs=require("fs"); var data; var s1=fs.createReadStream("input.txt"); s1.on("data",function(txt){ data+=txt; }) s1.on("end",function(){ console.log("文件流式读取成功!") }) 2.管道方式: var fs=requ

Node.js(十三)——Promise重构爬虫代码

在重构代码之前,先要了解下什么是https? https协议:基于ssl/tls的http协议,所有的数据都是在 ssl/tls协议的封装之上传输的,也就是说https协议是在http协议基础上 添加了ssl/tls握手以及数据加密传输,因此这就是两者之间最大的区别. https模块专门处理加密访问的,区别在于搭建https服务器的时候需要有ssl证书. 模拟搭建https服务器 var https = require('https') var fs = require('fs')//文件系统模

when 让你跳出异步回调噩梦 node.js下promise/A规范的使用

其实关于promise 的博客,前端时间专门写了一篇关于 promise 规范的文章,promise规范 让 javascript 中的异步调用更加人性化. 简单回忆下: promise/A规范定义的“Deferred/Promise”模型 其实是实现了“发布/订阅”模型. 通过Deferred对象发布事件, 包括下面2种事件 完成 --> resolve事件, 失败 --> reject事件, 通过Promise对象进行对应完成或失败的订阅 类似于任务状态转变时事件被触发. 将会对应的执行事