2017-02-27 51 views
0

我想在这里实现的是我想插入这个JSON到我的数据库,这是我的数据库正在使用SQL服务器。我有批量json数据,包含详细信息作为json树。下面是JSON数据,我想插入如何使用node.js插入批量JSON数据?

[ 
    { 
     No_BPS:'BSWEB12345', 
     Kd_Plg:'MMIM026', 
     Nm_Plg:'YAOMING', 
     Tgl_BPS:'2017-02-27T08:39:38.971Z', 
     Entry_Time:'2017-02-27T08:39:38.971Z', 
     User_Name:'tes', 
     Status:'Y', 
     Kd_Teknisi:'tes', 
     No_Ref:'RIRIMIMI609-001', 
     detailsData:[ 
     { 
      No_BPS:'BSWEB12345', 
      Kd_Brg:'RH-C779-SB', 
      Qty:2, 
      Alasan:'undefined', 
      Keterangan:'undefined' 
     } 
     ] 
    }, 
    { 
     No_BPS:'BSWEB99999', 
     Kd_Plg:'PTPS053', 
     Nm_Plg:'WARLORD', 
     Tgl_BPS:'2017-02-27T08:40:04.082Z', 
     Entry_Time:'2017-02-27T08:40:04.082Z', 
     User_Name:'tes', 
     Status:'Y', 
     Kd_Teknisi:'tes', 
     No_Ref:'PTKP1210-001', 
     detailsData:[ 
     { 
      No_BPS:'BSWEB99999', 
      Kd_Brg:'PS-230BIT SNI', 
      Qty:1, 
      Alasan:'undefined', 
      Keterangan:'undefined' 
     }, 
     { 
      No_BPS:'BSWEB99999', 
      Kd_Brg:'PS-130BIT SNI', 
      Qty:1, 
      Alasan:'undefined', 
      Keterangan:'undefined' 
     } 
     ] 
    } 
] 

这里是我的NodeJS代码:

exports.insert_BPS = function(req, resp) { 
    console.log(req.body); 
    req.body.map(headerdata=> 
     { 
      var sql = `INSERT INTO TblBPSHeader (
         No_BPS, Kd_Plg, Tgl_BPS, Entry_Time, User_Name, Status, Kd_Teknisi) values 
         ('` + headerdata.No_BPS + `', 
         '` + headerdata.Kd_Plg + `', 
         '` + dateFormat(headerdata.Tgl_BPS, "yyyy-mm-dd' 'HH:MM:ss") + `', 
         '` + dateFormat(headerdata.Entry_Time, "yyyy-mm-dd' 'HH:MM:ss") + `', 
         '` + headerdata.User_Name + `', 
         '` + headerdata.Status + `', 
         '` + headerdata.Kd_Teknisi + `')` 

      db.executeSql(sql, function(data, err) { 
       if (err) { 
        httpMsgs.show500(req, resp, err); 
       } else { 
        // httpMsgs.send200(req, resp); 
        console.log('header inserted'); 
       }; 
      }); 
      Promise.all(headerdata.detailsData.map 
       (detaildata => 

        { 
         console.log(detaildata); 
         var sqldetail = `INSERT INTO TblBPSDetail (
            No_BPS, kd_Brg, Qty, Alasan, Keterangan) values 
            ('` + detaildata.No_BPS + `', 
            '` + detaildata.Kd_Brg + `', 
            '` + detaildata.Qty + `', 
            '` + detaildata.Alasan + `', 
            '` + detaildata.Keterangan + `')` 

         db.executeSql(sqldetail, function(data, err) { 
          if (err) { 
           httpMsgs.show500(req, resp, err); 
          } else { 
           // httpMsgs.send200(req, resp); 
           console.log('detail inserted'); 
          }; 
         }); 
        } 
       ) 
      ) 
     } 
    ) 
}; 

但转出数据插入,但它在复制时,它总是循环中的数据,后首先插入数据是成功插入所有数据的,但是当我离开它一会儿时,它会再次插入它自己,所以数据将被复制并导致重复错误。我如何正确插入批量数据json?

+0

有趣的随机上使用Promise.all'的'返回undefined的地图 - –

+0

注意:我们在2017年,不要将原始值作为穴居人注入SQL,而是使用预准备语句。它还会防止脚本在数据碰巧包含单引号和其他特殊字符时随机崩溃。 –

回答

0

猜测你想要承诺获得此代码的工作,尽管你的代码似乎实际上并没有使用Promises - 尽管随机Promise.all埋在那里!

首先使用的承诺,你会希望有一个“promisified” exectueSql - 一旦你已经有了,剩下的实际上是相当直截了当

exports.insert_BPS = function(req, resp) { 
    // a promisified executeSql 
    let executeSql = (db, sql) => new Promise((resolve, reject) => db.executeSql(sql, (err, data) => { 
     if (err) { 
      return reject(err); 
     } 
     resolve(data); 
    })); 

    return Promise.all(req.body.map(headerdata => { 
     var sql = `INSERT INTO TblBPSHeader (
        No_BPS, Kd_Plg, Tgl_BPS, Entry_Time, User_Name, Status, Kd_Teknisi) values 
        ('` + headerdata.No_BPS + `', 
        '` + headerdata.Kd_Plg + `', 
        '` + dateFormat(headerdata.Tgl_BPS, "yyyy-mm-dd' 'HH:MM:ss") + `', 
        '` + dateFormat(headerdata.Entry_Time, "yyyy-mm-dd' 'HH:MM:ss") + `', 
        '` + headerdata.User_Name + `', 
        '` + headerdata.Status + `', 
        '` + headerdata.Kd_Teknisi + `')` 
     return executeSql(db, sql) 
     .then(() => Promise.all(headerdata.detailsData.map(detaildata => { 
      var sqldetail = `INSERT INTO TblBPSDetail (
           No_BPS, kd_Brg, Qty, Alasan, Keterangan) values 
           ('` + detaildata.No_BPS + `', 
           '` + detaildata.Kd_Brg + `', 
           '` + detaildata.Qty + `', 
           '` + detaildata.Alasan + `', 
           '` + detaildata.Keterangan + `')` 
      return executeSql(db, sqldetail);    
     }))); 
    })).then(results => { 
     // all done here 
     httpMsgs.send200(req, resp); 
    }).catch(reason => { 
     httpMsgs.show500(req, resp, reason); 
    }); 
};