zoukankan      html  css  js  c++  java
  • 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 ....");
    });
  • 相关阅读:
    Nginx 模块:--with-http_sub_status_module
    Nginx http请求&日志
    Nginx 目录和配置语法&DNS配置
    Nginx 全局配置
    Nginx 相关操作1
    Nginx入坑基础篇
    杂谈maven工程实践(3)
    杂谈maven工程类型(2)
    杂谈maven相关概念(1)
    Django
  • 原文地址:https://www.cnblogs.com/dybe/p/8227780.html
Copyright © 2011-2022 走看看