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. Java学生信息管理系统源码

    学生信息管理系统 功能说明 学生信息管理,包括学生.班级.院系.课程.成绩等的管理. 本程序仅供学习食用. 工程环境 JDK IntelliJ IDEA MySQL 运行说明 1.安装JDK. 2.导 ...

  2. 使用树莓派远程控制灯继电器开关,dht11温湿度网页显示,树莓派物联网

    前段时间使用esp8266搞了个智能家居,通过网页控制,但是没有办法实现远程控制,只能局域网控制,因为我没有平台,使用机制云等平台还需要开发app 使用chatgpt生成的main.py程序 from ...

  3. 剑指offer66(Java)-构建乘积数组(中等)

    题目: 给定一个数组 A[0,1,-,n-1],请构建一个数组 B[0,1,-,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×-×A[i ...

  4. 力扣344(java & python)-反转字符串(简单)

    题目: 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这一问题. 示例 1 ...

  5. 力扣273(java)-整数转换英文表示(困难)

    题目: 将非负整数 num 转换为其对应的英文表示. 示例 1: 输入:num = 123输出:"One Hundred Twenty Three"示例 2: 输入:num = 1 ...

  6. 力扣405(java)-数字转换为十六进制(简单)

    题目: 给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写.十六进制字符串中不能包含多余的前导零.如果要转 ...

  7. iLogtail社区版使用入门 - 采集MySQL Binlog

    简介: MySQL Binlog记录了MySQL的变更日志,业界也有一些方案来同步Binlog的数据,如Canal.MaxWell.DTS等.不同的工具可以实现不同的目标,iLogtail也提供了便捷 ...

  8. 基于 OPLG 从 0 到 1 构建统一可观测平台实践

    简介: 随着软件复杂度的不断提升,单体应用架构逐步向分布式和微服务的架构演进,整体的调用环境也越来越复杂,仅靠日志和指标渐渐难以快速定位复杂环境下的问题.对于全栈可观测的诉求也变得愈加强烈,Trace ...

  9. 阿里云拨测:主动探测Web应用质量,助力提升用户体验

    简介: 阿里云拨测是一种针对互联网应用(Web页面.网络链路等)进行应用性能和用户体验监测的服务,无需嵌码即可为云上用户提供开箱即用的企业级主动拨测式应用监测解决方案. 随着中国数字化经济的蓬勃发展, ...

  10. KubeVela v1.2 发布:你要的图形化操作控制台 VelaUX 终于来了!

    ​简介:时间来到 2022 年,KubeVela 也正式进入了第四个阶段,在原先核心控制器 API 基本稳定的基础上,我们以插件的形式增加了一系列开箱即用的功能.让开发者可以通过 UI 控制台的方式, ...