在Node.js使用Promise的方式操作Mysql

來源:互聯網
上載者:User

標籤:values   from   錯誤資訊   factory   並且   嵌套   read   json   message   

最近在學習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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.