【问题标题】:How to insert bulk JSON data with node.js?如何使用 node.js 插入批量 JSON 数据?
【发布时间】:2017-07-17 21:09:40
【问题描述】:

我想在这里实现的是我想将此 JSON 插入到我的数据库中,这是我的数据库正在使用 sql server。我有批量 json 数据,其中包含 json 树的详细信息。下面是 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?

【问题讨论】:

  • 在返回 undefined 的地图上有趣地随机使用 Promise.all -
  • 旁注:我们在 2017 年,不要像穴居人一样将原始值注入 SQL,使用准备好的语句。当数据恰好包含单引号和其他特殊字符时,它还可以防止您的脚本随机崩溃。

标签: javascript json node.js promise es6-promise


【解决方案1】:

猜测您希望 Promises 让这段代码正常工作,尽管您的代码似乎根本没有真正使用 Promises - 尽管随机的 Promise.all 埋在那里!

首先,要使用 Promises,你需要一个“承诺的”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);
    });
};

【讨论】:

    猜你喜欢
    • 2018-07-29
    • 1970-01-01
    • 2015-06-10
    • 2013-11-07
    • 1970-01-01
    • 2017-05-01
    • 2016-11-18
    • 2012-02-12
    • 2012-04-17
    相关资源
    最近更新 更多