2017-02-27 58 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); 
    }); 
};