server.js文件
const dao = require("../dao/user.dao");
saveDat是个对象自己处理一下
if (updataFlag) {//编辑角色
result = await dao.roleUpdata(saveDta);
} else {//新增角色
saveDta.role.create_name = user.name;
saveDta.role.code = need.code;
result = await dao.roleAdd(saveDta);
} return result;

编辑角色

dao文件就是上面引入的文件 
roleUpdata(need) {
     const dcMeun = "表名"
      let list = [];//编辑过来的先删除库里面的按角色code删除所有
let roleProductMap = db.remove(dcMeun, {
role_code: need.code
}, true)
list.push({
sql: roleProductMap.sql,
param: roleProductMap.param
})
//如果有选择产品 往库里面批量增加
if (Array.isArray(need.products) && need.products.length > 0) {
let addProduct = db.bulkCreate(dcMeun, need.products, true)
list.push({
sql: addProduct.sql,
param: addProduct.param
})
}
return db.execTransaction(list);
},

    /**
     * 批量增加数据
     * @param table 表名
     * @param moduleBean 要添加的字段 [ {字段名:字段值}]
     * 例:db.bulkCreate(tableName, [{id:'12', name:'jerry'}, {id:'115', name:'hou'}]);
     */
    bulkCreate(table, moduleBean, isConfig) {
      let attributes = new Set();
      let values = [];
      moduleBean.forEach(ele => {
        let value = [];
        for (var key in ele) {
          attributes.add(key);
          value.push(ele[key]);
        }
        values.push(value);
      });
      var _sql = `INSERT INTO ${table}(${Array.from(attributes).join(',')}) VALUES ? `;
      if (isConfig) {
        return {
          sql: _sql,
          param: [values]
        }
      } else {
        return this.execSql(_sql, [values]);
      }
    },
   /**
     *  自定义 SQL 语句
     * 【注】表名一定要用??两个问号
     */
    execSql(sql, values, field = false) {
      return new Promise((resolve, reject) => {
        pool.getConnection(function (err, connection) {
          if (err) {
            connection && connection.release();
            reject(err);
          } else {
            var query = connection.query(sql, values, (err, rows, fields) => {
              connection.release();
              if (err) {
                reject(err);
                process.logger.error("SQL Error:[", err, "]");
              } else {
                if (field) {
                  resolve({
                    data: rows,
                    fields: fields
                  });
                } else {
                  resolve(rows);
                }
              }
            });
            process.logger.trace("Current Exec SQL:[", query.sql, "]");
          }
        });
      });
    },
  /**
    * 开启事务处理
    * @param sqlParamList sql语句和参数对象数组
    例:
    db.execTransaction([{
      sql: "INSERT INTO ?? SET?",
      param : [table, entity],
      callback: function(result){
      //执行成功回调
      console.log(result);
    }
    },{
      sql: "INSERT INTO ?? SET email=?",
      param : [table, 'lixia@goinni.com'],
      callback: function(result){
      console.log(result);
      }
    },{
      sql: "INSERT INTO ?? SET email=?",
      param : [table, 'limeizhen@goinni.com']
    }]);
    */
    execTransaction(sqlParamList) {
      return new Promise((resolve, reject) => {
        pool.getConnection(function (err, connection) {
          if (err) {
            resolve(err);
          } else {
            connection.beginTransaction(function (err) {
              if (err) {
                reject(err);
                connection.release();
                //throw err;
              }
              var n = 0,
                res = [];
              // 递归处理多条 SQL 语句
              function ac(sqlParamList) {
                var item = sqlParamList[n];
                var qr = connection.query(item.sql, item.param, function (error, results, fields) {
                  res.push(results); //缓存结果,统一返回
                  if (error) {
                    return connection.rollback(function () {
                      //throw error;
                      reject(error);
                      connection.release();
                    });
                  }
                  process.logger.trace(`Current Exec SQL:[${qr.sql}]`);
                  if (n === sqlParamList.length - 1) {
                    // 最后统一提交
                    connection.commit(function (err) {
                      if (err) {
                        return connection.rollback(function () {
                          //throw err;
                          reject(err);
                          connection.release();
                        });
                      }
                      resolve(res);
                      connection.release();
                      process.logger.info('Transaction Success!');
                    });
                  } else {
                    n++;
                    //将结果回传给当前方法,方便后续使用
                    item.callback && item.callback(results);
                    //递归
                    ac(sqlParamList);
                  }
                });
              }
              ac(sqlParamList);
            });
          }
        });
      });
    },
 

新增角色

   roleAdd(need) {
let list = [];
//新增就直接批量增加了
if (Array.isArray(need.products) && need.products.length > 0) {
let productAdd = db.bulkCreate(dcMeun, need.products, true)
list.push({
sql: productAdd.sql,
param: productAdd.param
})
}
return db.execTransaction(list);
},
里面的bulkCreate和execTransaction函数都和上面编辑的一模一样

记录nodejs做编辑和新增时候对数据库的操作的更多相关文章

  1. Git学习记录 力做全网最强入门教程

    目录 Git学习记录 力做全网最强入门教程 什么是GitHub? 什么是Git? Git的配置 Git的安装(只介绍windos操作系统下) Git的配置 至此我们的入门教程到此结束,更新中级教程要等 ...

  2. PB中用oracle的存储过程返回记录集做数据源来生成数据窗口,PB会找不到此存储过程及不能正常识别存储过程的参数问题(转)

    (转)在PB中用oracle的存储过程返回记录集做数据源来生成数据窗口 首先oracle的存储过程写法与MSSQL不一样,差别比较大. 如果是返回数据集的存储过程则需要利用oracle的包来定义游标. ...

  3. nodejs 做后台的一个完整业务整理

    大家知道js现在不仅仅可以写前端界面而且可以写后端的业务了,这样js就可以写一个全栈的项目.这里介绍一个nodejs + express + mongodb + bootstap 的全栈项目. 1.安 ...

  4. Nodejs做整站转发

    刚接触nodejs,做个东西练下手,通过nodejs直接转发整站,原本想把内容全翻译成英文,但google对流量行审查,被封IP,所以就没啥用了, 效果像这样 var b = function (a, ...

  5. windows下百度离线人脸识别本地部署与使用(nodejs做客户端,c++做服务端,socket做通信)

    1.离线人脸识别本地部署 详情请阅读百度人脸识别官网 2.nodejs做socket通信的客户端 为什么不直接通过调用c++编译的exe获得人脸识别结果? 原因:exe运行时会加载很多模型而消耗很多时 ...

  6. vue编辑、新增弹框(引用外部页面)

    vue编辑.新增弹框(引用外部页面) 2018年06月15日 09:37:20 会飞的猪biubiu 阅读数 10265    版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  7. 跟我一起学extjs5(18--模块的新增、改动、删除操作)

    跟我一起学extjs5(18--模块的新增.改动.删除操作)         上节在Grid展示时做了一个金额单位能够手工选择的功能,假设你要增加其它功能.也仅仅要依照这个模式来操作即可了,比方说你想 ...

  8. SSM Mybatis将新增数据写入数据库时出现的500状态码:Error updating database.的可能

    关于maven下ssm整合的项目推荐这篇博客:https://www.cnblogs.com/yiye/p/5969157.html 今日在ssm下的将新增数据写回数据库时遇到不少的问题,现作记录 如 ...

  9. SQLSERVER数据库备份操作和还原操作做了什么

    SQLSERVER数据库备份操作和还原操作做了什么 看了这篇文章:还原/备份时做了些什么 自己也测试了一下,下面说的错误日志指的是SQLSERVER ERRORLOG 一般在C:\Program Fi ...

  10. 记录CentOS7.X版本下安装MySQL5.7数据库

    记录CentOS7.X版本下安装MySQL5.7数据库  设置rpm下载目录在/opt目录下新建一个目录存放mysql cd /opt sudo mkdir mysql12  下载MySQL的源 wg ...

随机推荐

  1. Javascript中的继承?如何实现继承?

    一.是什么 继承(inheritance)是面向对象软件技术当中的一个概念 如果一个类别B"继承自"另一个类别A,就把这个B称为"A的子类",而把A称为&quo ...

  2. 最简编译CockroachDB 21.2

    编译CockroachDB比较麻烦,尤其是从git下载代码编译还需要关联项目的下载,本文整理从官网下载代码的编译过程,非常简单,几乎没有异常,供大家参考. 编译CockroachDB 21.2 1.安 ...

  3. 第12課-Mirth生产环境宕机后基于服务配置XML备份恢复之记录

    Mirth Connect作为集成交换平台,生产环境互联互通了众多系统,脑残的是连自家关键业务系统都依托mirth来进行交互,宕机或故障对身处其中的一次紧张的业务系统升级都造成高度的精神紧张:这种宕机 ...

  4. 最佳实践丨构建云上私有池(虚拟IDC)的5种方案详解

    ​简介:云上私有池系列终篇终于来了,本文将重点介绍构建云上的私有池(虚拟IDC)的多种方案和各自的优缺点,并给出相关的性价比优化建议. 本文作者:阿里云技术专家李雨前 摘要 围绕私有池(虚拟IDC)的 ...

  5. AI和大数据结合,智能运维平台助力流利说提升核心竞争力

    简介: 简介:本文整理自数智创新行--智能运维专场(上海站),流利说最佳实践演讲:<基于SLS千万级在线教育平台统一监控运营实践> 作者:孙文杰 流利说运维总监元乙 阿里云智能技术专家 优 ...

  6. ICBU可控文本生成技术详解

    ​简介: 文本生成(Text Generation)是自然语言处理(Natural Language Processing,NLP)领域的一项重要且具有挑战的任务.顾名思义,文本生成任务的目的是生成近 ...

  7. WPF 获取全局所有窗口的创建显示事件 监控窗口打开

    本文将告诉大家如何在 WPF 里面进行全局监控任意的窗口创建显示打开,可以获取到每个 WPF 窗口的打开的时机.如此可以用来辅助定位问题和输出日志 这篇博客是有背景的,老司机告诉我说他的应用不响应鼠标 ...

  8. 5.k8s Service四层负载:服务端口暴露

    题目一:暴露服务service 设置配置环境: [candidate@node-1] $ kubectl config use-context k8s Task 请重新配置现有的 deployment ...

  9. VUE知识体系、VUE面试题

    1. computed(计算属性)和方法有什么区别? 计算属性本质上是包含 getter 和 setter 的方法 当获取计算属性时,实际上是在调用计算属性的 getter 方法.vue 会收集计算属 ...

  10. 自制一个发送验证码的10秒倒计时js效果

    <template>     <div class="conten1">         <input class="code"  ...