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