js:nodejs通過async異步提交事務數據


一,async異步編程

1,異步編程是指由於異步I/O等因素,無法同步獲得執行結果時, 在回調函數中進行下一步操作的代碼編寫風格,常見的如setTimeout函數、ajax請求等等

waterfall函數 瀑布流

waterfall每個函數產生的值,都將傳給下一個函數

2,事務

 

數據庫事物(transaction)就是一組SQL語句,這組SQL語句是一個邏輯工作單元。我們可以認為事務就是一組不可

 

分割的SQL語句,在執行時,應該作為一個整體永久性地修改數據庫的內容,或者作為一個整體取消對數據庫的所有修改。

 

例:銀行轉帳:將錢從一個銀行帳號轉到另一個帳號中通常包含二個步驟:一條UPDATE語句負責從一個銀行帳號的總額中減去一定的錢數,另外一條UPDATE語句負責向另外一個銀行帳號中增加錢數,這兩個減少和增加操作要么同時永久性地保存到數據庫,要么全部取消――――否則就會有一部份錢丟失了。

二,

1,在網頁中提交數據

Zxly.ejs

 

 
         
<script src="../js/jquery.min.js"></script>
    <script type="text/javascript">
        var i=0;
        $(document).ready(function(){
            $("#send").click(function(){
                if(i==1){
                    alert("請不要重復提交!")
                }else {
                    i=1;
                    var nc = $("#nc").val();
                    var qq = $("#qq").val();
                    var em = $("#em").val();
                    var zt = $("#zt").val();
                    var nr = $("#nr").val();
                    $.get("../action/zxly.js", {nc: nc, qq: qq, em: em, zt: zt, nr: nr}, function (result) {
                        console.log(result.args);
                        if (result.args=="ok") {
                            alert("留言成功!")
                        }
                    })
                }
            })
        })


    </script>

<
div class="message-table"> <ul> <li> <span class="tab-tit">昵 稱 :</span> <span><input type="text" name="name" id="nc" placeholder="請輸入昵稱" autocomplete="off"></span> <span class="tab-des"></span> </li> <li> <span class="tab-tit">Q Q :</span> <span><input type="text" name="qq" id="qq" placeholder="請輸入QQ" autocomplete="off"></span> </li> <li> <span class="tab-tit">E-mail :</span> <span><input type="text" name="e-mail" id="em" placeholder="請輸入E-mail" autocomplete="off"></span> </li> <li> <span class="tab-tit">留言主題 :</span> <span><input type="text" name="zt" id="zt" placeholder="請輸入主題" autocomplete="off"></span> <span class="tab-des"></span> </li> <li> <span class="tab-tit">留言內容 :</span> <span><textarea name="content" id="nr" class="" placeholder="請輸入留言內容"></textarea></span> <span class="tab-des"></span> </li> </ul> <div class="table-btn"> <input type="button" name="" value="發 表" class="send-btn" id="send"/> <input type="reset" name="" value="重 置" class="reset-btn" id="reset" /> </div> </div>

 

2,在js中接收數據

/**
 * Created by dyb on 2018/1/4.
 */
function zxly(router,db) {

    
    //調用函數接收數據
    router.get("/action/zxly.js?",function(req,res) {
        //獲取數據庫中的數據

            //req.query:獲取URL的查詢參數串
            var par=req.query;
            var nc=par.nc;
            var qq=par.qq;
            var em=par.em;
            var zt=par.zt;
            var nr=par.nr;
            var fsql = "insert into ly_zx(ly_name,ly_qq,ly_email)values(?,?,?)";
            var tsql = "insert into ly_nr(nr_zt,nr_ly,nr_id)values(?,?,?)";
            console.log(nc+" "+qq+" "+em+" "+zt+" "+nr);
            console.log(fsql+" "+tsql);
            var addfsql=[nc,qq,em];
            var addtsql=[zt,nr];
      //調用外部函數將數據存入數據庫 db.waterfall(fsql,tsql,addfsql,addtsql,
function(result){ console.log(result); if(result!=null){ res.send({"args":result}); } }); }) } module.exports=zxly;

3,存入數據

db.js

Db.waterfall=function(fsql,tsql,addfsql,addtsql,fun){
                //從連接池獲得連接
                pool.getConnection(function(err,connection){
                    //開啟事務
                    connection.beginTransaction(function(err){
                        if(err){
                            throw err;
                        }
                        //async異步 waterfall函數 瀑布流
                        async.waterfall([
                            function(callback){
                                console.log(fsql);
                              connection.query(fsql,addfsql,function(err,result){
                                  if(err){
                                      console.log("數據添加失敗1:"+err);
                                      return
                                  }
                                  callback(null,result.insertId)
                              })
                            },function(id,callback){
                                //var tsql="insert into ly_nr(nr_zt,nr_ly,nr_id)values("+zt+","+nr+"";
                                addtsql.push(id);
                                console.log(tsql);
                                connection.query(tsql,addtsql,function(err,result){
                                    if(err){
                                        console.log("數據添加失敗2:"+err);
                                        connection.rollback();
                                    }
                                    //提交數據
                                    connection.commit();
                                    connection.release();
                                    callback(null,'ok')
                                })
                            }
                        ],function(err,result){
                            fun(result)
                        })
                    })
                })
            }

4,配置路由

app.js

/**
 * Created by dyb on 2018/1/4.
 */
var express = require('express');
var Db=require('./db/db.js');
var app = express();
var url= require("url");
app.set('view engine', 'ejs');
app.set('views', __dirname + '/views');
app.use(express.static( __dirname+"/public"));
var router = express.Router();

app.locals.basePath = "http://localhost:3001/";


/*直接訪問模版需要輸入.ejs后輟*/
app.get('/ee/*', function(req, res,next){
    var pagePath= url.parse(req.url).pathname;
    if(pagePath.indexOf(".ejs")!=-1){
        pagePath=pagePath.substr(1);
        pagePath=pagePath.substr(0,pagePath.length-4);
        res.render(pagePath);
    }else {
        next();
    }
});

var scfk=require('./action/scfk.js');
var p =new scfk(router,Db);

var zxly=require('./action/zxly.js');
var p =new zxly(router,Db);



app.use("/",router);
var server=app.listen(3001,function afterListen(){
    console.log("express running ....");
});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM