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