一,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 ....");
- });*/
来源: http://www.bubuko.com/infodetail-2453093.html