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

原文地址:https://www.cnblogs.com/dybe/p/8227780.html

时间: 2024-10-11 01:33:55

js:nodejs通过async异步提交事务数据的相关文章

nodejs之async异步编程

首先登场的是series函数,它的作用是串行执行,一个函数数组中的每个函数,每一个函数执行完成之后才能执行下一个函数,示例如下: async.series({ one: function(callback){ callback(null, 1); }, two: function(callback){ callback(null, 2); } },function(err, results) { }); series函数的第一个参数可以是一个数组也可以是一个JSON对象,参数类型不同,影响的是返

nuxt.js中asyncData 方法能够在渲染组件之前异步获取数据

https://zh.nuxtjs.org/api/ asyncData 方法 你可能想要在服务器端获取并渲染数据.Nuxt.js添加了asyncData方法使得你能够在渲染组件之前异步获取数据. asyncData方法会在组件(限于页面组件)每次加载之前被调用.它可以在服务端或路由更新之前被调用. 原文地址:https://www.cnblogs.com/marquess/p/12628749.html

nodejs 中的异步之殇

nodejs 中的异步之殇 终于再次回到 nodejs 异步中,以前我以为异步在我写的文章中,已经写完了,现在才发现,还是有很多的地方没有想清楚,下面来一一说明. 模块同步与连接异步 大家应该,经常使用 express 进行网站开发.express 本来的问题不是重点,你肯定要用到第三工具,redis, mysql 了之类的. redis 需要连接,而连接成功需要一个回调(他是一个异步).问题就在这里,这个问题是:倒底是 redis 先连接成功,还是 express 先启动成功? redis.o

jQuery基础(Ajax,load(),getJSON(),getScript(),post(),ajax(),同步/异步请求数据)

1.使用load()方法异步请求数据 使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url,[data],[callback]) 参数url为加载服务器地址,可选项data参数为请求时发送的数据,callback参数为数据请求成功后,执行的回调函数. 2.使用getJSON()方法异步加载JSON格式数据 使用getJSON()方法可以通过Ajax异步请求的方式,获取服务器中的数据,并对获取的数据进行解析,显示在页面中,它的

详解回调函数——以JS为例解读异步、回调和EventLoop

转自:http://blog.csdn.net/tywinstark/article/details/48447135#comments 很多人在问什么是回调?百度出来的答案基本都不正确,看了只会让人更加迷惑.下文试着用尽量简单的例子帮大家梳理清楚,因为回调并不是一句话下定义就能明白的概念,需要用一段文字像讲故事一样来说明,回调如同很多重要的计算机概念一样,它是有历史文化的,你需要知道它从哪里来,用来干什么,才能理解及在实际生产中应用. 回调,是非常基本的概念,尤其在现今NodeJS诞生与蓬勃发

Validform和aui2.0结合使用的表单自定义验证提示和列表页异步获取数据Demo

二.添加自定义验证演示       Validform验证提示大多都是在输入框或下拉框的右边或下面.感觉就是不美观,特别是表单字段少的时候,这种在相应对象旁边的提示就没必要了,      它会给人一种不友好的感觉(只是自己的感觉).所以下面写了三种添加演示,希望大家能给出建议,以免下次用起来纠结,不知道用哪种好.        表单验证插件是我们经常使用的Validform_v5.3.2_min.js.先上添加1演示的表单验证js代码,这里我设置了点击提交按钮后才验证.其他添加演示的区别不大,详

使用load()方法异步请求数据

使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url,[data],[callback]) 参数url为加载服务器地址,可选项data参数为请求时发送的数据,callback参数为数据请求成功后,执行的回调函数. 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/

JSF页面中的JS取得受管bean的数据(受管bean发送数据到页面)

JSF中引入jsf.js文件之后,可以拦截jsf.ajax.request请求.一直希望有一种方法可以像jquery的ajax一样,能在js中异步取得服务器端发送的数据.无奈标准JSF并没有提供这样的方法.在一些JSF框架里面提供了这样的方法,比如primefaces的onComplete方法就是返回数据到一个js方法中的.JSF能在bean里面更新视图(非ajax更新),其中的PartialViewContext类就可以做到局部更新UI,在bean里获取到这个UI就可以了.于是在网上翻看了很多

从Vue.js源码看异步更新DOM策略及nextTick

写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/answershuto/learnVue.在学习过程中,为Vue加上了中文的注释https://github.com/answershuto/learnVue/tree/master/vue-src,希望可以对其他想学习Vue源码的小伙伴有所帮助.可能会有理解存在偏差的地方,欢迎提issue指出,共同学