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 ....");
});

 

posted @ 2018-01-07 12:39  dybe  阅读(1438)  评论(0编辑  收藏  举报