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使用ganymed工具包执行LINUX命令教程

    了解更多开发技巧,请访问,架构师小跟班官网:https://www.jiagou1216.compackage com.jiagou;import ch.ethz.ssh2.Connection;im ...

  2. MAC Book: Operation not permitted

    背景: 最近清理系统上的一些无用的文件后,为了release出可用空间,所以还要把.Trash目录下的文件清理才真正清理完,但是ls 查看该目录时发现一直报"operation not pe ...

  3. 力扣237(java&python)-删除链表中的节点(中等)

    题目: 有一个单链表的 head,我们想删除它其中的一个节点 node. 给你一个需要删除的节点 node .你将 无法访问 第一个节点  head. 链表的所有值都是 唯一的,并且保证给定的节点 n ...

  4. 阿里云 MSE 支持 Go 语言流量防护

    简介: OpenSergo 开源项目联合 Sentinel 项目,正在制定.完善限流降级标准,方便不同语言应用通过统一控制面来实现统一的微服务治理.阿里云微服务引擎(MSE)也会逐步支持 OpenSe ...

  5. 创新推出 | Serverless 场景排查问题利器:函数实例命令行操作

    ​简介: 实例命令行功能的推出希望能消除用户使用 Serverless 的"最后一公里",直接将真实的函数运行环境展现给用户,此后 Serverless 将不再是一个"黑 ...

  6. Fluid 给数据弹性一双隐形的翅膀 -- 自定义弹性伸缩

    简介: 弹性伸缩作为 Kubernetes 的核心能力之一,但它一直是围绕这无状态的应用负载展开.而 Fluid 提供了分布式缓存的弹性伸缩能力,可以灵活扩充和收缩数据缓存. 它基于 Runtime ...

  7. 为什么DevOps的必然趋势是BizDevOps

    简介: 从精益思想出发,我们可以看到DevOps的必然发展方向,那就是向业务侧延伸.业务是产品开发和运维的源头,完整的价值流必须从源头开始.这不是预测,而是正在发生的事. 编者按:本文源自阿里云云效团 ...

  8. [Go] go-nsq 使用指南

    首先你需要有一个 nsq 的服务端,nsq 由三部分构成:nsqd.nsqlookupd.nsqadmin. 快速启动 nsq 一个节点看这里:https://github.com/farwish/n ...

  9. 2018-2-13-win10-uwp-无法附加到CoreCLR

    title author date CreateTime categories win10 uwp 无法附加到CoreCLR lindexi 2018-2-13 17:23:3 +0800 2018- ...

  10. K8s控制器---DaemonSet控制器(12)

    一.DaemonSet控制器:概念.原理解读 1.1 DaemonSet概述 DaemonSet 控制器能够确保 k8s 集群所有的节点都运行一个相同的 pod 副本,当向 k8s 集群中增加 nod ...