迭代集合对象并使用节点js插入到db中

时间:2017-09-26 15:03:20

标签: javascript node.js

我是Node js的新手,并尝试使用for循环并将数据插入数据库来迭代集合中的每个项目。

我已经实现了以下代码,但它只插入了集合中的最后一个对象。

我还想获取每个请求的参数值..我需要用请求映射

任何人都可以节省我的时间。

以下是代码。

       app.post('/api/upload/UpdateQualityExcel',function(req,res){

             UpdateQualityExcel_Flag = req.param('Flag');

             body_data=req.body;

             UpdateQualityExcel_res_data=[];

               // var i=1;
            for(i=0;i<body_data.EXCEL_ROWS.length;i++)
            {

                Postdata(UpdateQualityExcel_Flag, body_data.EXCEL_ROWS[i], function(id) {
                    console.log(id);    
                }); 

            }

         });


        function Postdata(UpdateQualityExcel_Flag, EXCEL_ROWS, cb) {

            sql.close();
            sql.connect(config, function (err) {

                if (err) console.log(err);
                  //create Request object
                var request = new sql.Request();

                console.log(EXCEL_ROWS);

                request.input('p_Flag', sql.VarChar, UpdateQualityExcel_Flag)
                request.input('p_ProjectCode', sql.NVarChar, EXCEL_ROWS.PROJECT_CODE);
                request.input('p_ActivityId',sql.INT,EXCEL_ROWS.ACTIVITY_ID);
                request.input('p_ActivityName', sql.VarChar, EXCEL_ROWS.ACTIVITY_NAME);
               request.output('po_Message',sql.VarChar)

                // query to the database and get the records
                request.execute("[dbo].[ARA_SP_ACTION_QualityExcelUpdate]").then(function(recordSet) {

                      if (recordSet == null || recordSet.length === 0)
                        return;

                    // res.send(recordset);
                    cb("test");


                }).catch(function (err) {         
                    console.log(err);

                });
            });
        }

1 个答案:

答案 0 :(得分:0)

Postdata是异步的,我们可以看到我们有多个实例同时运行。

据说,他们都使用全局变量sql。我打赌这里有一些冲突。

首先Postdata打开连接以便推送,然后另一个Postdata实例关闭它。

我建议你这样做:

  • 打开连接
  • 同时执行所有插入
  • 关闭连接

修改

以下是一些可以帮助您解决问题的代码,显然是一个开始:)

function postdata(UpdateQualityExcel_Flag, EXCEL_ROWS) {
  return new Promise((resolve, reject) => {
    // 
    // ... do stuff ...
    // 
    request.execute("[dbo].[ARA_SP_ACTION_QualityExcelUpdate]")
      .then(resolve)
      .catch(reject);
  });
}
// Call all postData
Promise.all(body_data.EXCEL_ROWS.map(x => postData(UpdateQualityExcel_Flag, x)))
  .then((rets) => {
    // All your answers are here
  })
  .catch((err) => {
    // You got here in case of error
  });