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

  • 相关阅读:
    microsoft.extensions.logging日志组件拓展(保存文本文件)
    Winform 窗体皮肤美化_IrisSkin
    MailKit/MimeKit 发送邮件
    Winform 美化
    HTML CSS布局定位
    Newtonsoft.Json使用技巧
    Javascript 日历插件
    非靜態初始化塊與夠着函數的 執行順序
    java中堆栈的功能作用 以及區別(搜集)
    Java中数据类型相互转化
  • 原文地址:https://www.cnblogs.com/blueroses/p/7170626.html
Copyright © 2020-2023  润新知