2017-06-13 34 views
0

我试图根据在ajax调用中传递的参数对节点页进行ajax调用,该页面对数据库执行一些操作。 我面临的问题是,即使在nodejs结束所有数据库事务完成之前,该控件仍会传回到html页面(我正在使用警报来测试请求完成),从而启动ajax调用。 为了更好的理解,我添加了一个较小的代码版本。只有在nodejs路由器上的所有事务完成后才返回到ajax调用

Origin: HTML page 
<div id="paramList"> 
    <form action='import/other' method='POST' style='display:none;' id="h_form"> 
    <label><input type="checkbox" value="opt1" />Option 1</label> 
    <label><input type="checkbox" value="opt2" />Option 2</label> 
    <label><input type="checkbox" value="opt3" />Option 3</label> 
    <label><input type="checkbox" value="opt4" />Option 4</label> 
    <label><input type="checkbox" value="opt5" />Option 5</label> 
    </form> 
</div> 
<button onclick="startValidation()">Submit</button> 

Handler: JS 
function startValidation() { 
    var paramlist = ''; 
    $("#paramList input[type='checkbox']").each(function() { 
     if ($(this).is(":checked")) { 
      paramlist += "'" + $(this).val() + "',"; 
     } 
    }); 
    paramlist = paramlist.substr(0, paramlist.length - 1); 

    var req = $.ajax({ 
     url: '/import/validate', 
     type: 'POST', 
     data: { paramList: paramlist, fileName: finalName } 
    }) 
    req.done(function(data, status) { 
     alert('Data validated successfully. Select Ok to go to validate sheet: ' + status); 
     var form = $("#h_form"); 
     form.submit(); 
     //redirect to the other page and load data from the latest insert 
    }); 
    req.fail(function(xOptions, textStatus) { 
     alert('Error occured!: ' + textStatus); 
    }); 

} 

服务器端脚本

NodeJS: Router 
router.post('/validate',function(req,res){ 
    var paramlist = req.body.paramList; 
    var fileName = req.body.fileName; 
    var cli = modImport.parseFile(fileName,paramlist); 
    res.send(cli); 
}); 

//Import module: modImport.js 
module.exports.executeQuery = function(strSQL, operationType, tableName, cb, param) { 
    logger.log('debug','running query: '+strSQL); 

    var request = new sql.Request(connection); 
    request.query(strSQL,function(err, recordset) { 
     if(err){ 
      logger.error('ERROR in '+operationType+' ON '+tableName+': '+err); 
     } 
     logger.info(operationType+' ON '+tableName+' successful!'); 
     if(cb){ 
      cb(param); 
     } 
    }); 

}, 

module.exports.parseFile: function(filePath, validateParam){ 
    sql.connect(config).then(function() { 
     var arr = []; 
     arr.push(data);arr.push(validateParam); 
     arr.push(tName); 

     var delQ = "DELETE FROM [Tbl_TempData]"; 
     util.executeQuery(delQ,'DELETION','[Tbl_TempData]', module.exports.bulkImportIntoTempData, arr); 

     console.log("deletion completed"); 

    }).catch(function(err) { 
     logger.error('other error: '+err); 
    }); 
}, 

module.exports.bulkImportIntoTempData: function(arr){ 
    var data = arr[0]; 
    var validateParam = arr[1]; 
    var tName = arr[2]; 

    var bInQ = "INSERT INTO [Tbl_TempData] (field1,field2,field3) VALUES "; 
    data.forEach(function(rec, index){ 
     var keys = Object.keys(rec); 
     var kLen = keys.length - 1; 

     keys.forEach(function(datum,cursor){     
      bInQ += "('" + datum + "','" + rec[datum] + "','" + tName + ")"; 
      if(cursor < kLen){ 
       bInQ += ","; 
      } 
     }); 
    }); 
    module.exports.executeQuery(bInQ,'BULK INSERTION','[Omni_TempSurveyData]',module.exports.processForTempCalc,validateParam); 
}, 

module.exports.processForTempCalc: function(validateParam){ 
    var strSQL = "DELETE FROM [Tbl_TempCalc]"; 
    util.executeQuery(strSQL,'DELETION','[Tbl_TempCalc]',module.exports.insertIntoTempCalc,validateParam); 
}, 

module.exports.insertIntoTempCalc: function(validateParam){ 
    var strSQL = "INSERT INTO ....."; 
    //some transformations here from other tables 
    util.executeQuery(strSQL,'INSERTION','[Tbl_TempCalcData]'); 


}, 

module.exports.insertIntoBlankCalc: function(validateParam){ 
    var strSQL = "INSERT INTO ....."; 

    util.executeQuery(strSQL,'INSERTION','[Tbl_BlankCalcData]'); 

    //TODO: return the ajax call 
} 

阿贾克斯完成后,用户将被重定向到从最后插入表中加载数据的页面。但是由于在最终插入之前弹出警报,因此重定向的页面对用户显示为空白。 请建议如何克服这种情况。

+0

请分享您的服务器端代码! – farhadamjady

+0

@farhadamjady从注释开始的代码// NodeJS:Router是这个服务器端的代码 –

回答

0

如果我是正确的“modImport.parseFile”函数不返回任何内容,只是在承诺中调用“util.executeQuery”。

所以在这一行“var cli = modImport.parseFile(fileName,paramlist);” cli没有被重视并产生错误;

我想你应该发送“res.send(CLI)”作为回调“modImport.parseFile”作为参数,然后将其发送的“util.executeQuery”或你应该改变你的功能

更新: 我改变你的代码这种方式。所以我不能运行它,但我想它会起作用。希望能帮助到你。

router.post('/validate',function(req,res){ 
    var paramlist = req.body.paramList; 
    var fileName = req.body.fileName; 

    var GLOBAL.response_function = function(err,data) 
    { 
     //here you can do anything with your data or err; 
     // like that 

     if (err) 
     { 
      return res.status(404).send(err.toString()); 
     } 
     else 
     { 
      // if your data is json 
      return res.status(200).send(JSON.stringify(data)); 
     } 
    }; 

    modImport.parseFile(fileName,paramlist) ; 
}); 

module.exports.executeQuery = function(strSQL, operationType, tableName, cb, param) { 
    logger.log('debug','running query: '+strSQL); 

    var request = new sql.Request(connection); 
    request.query(strSQL,function(err, recordset) { 
     if(err){ 
      logger.error('ERROR in '+operationType+' ON '+tableName+': '+err); 
     } 
     logger.info(operationType+' ON '+tableName+' successful!'); 

     if(cb){ 

      if (param.is_return_callback) 
      { 
       cb(err, recordset) 
      } 
      else 
      { 
       cb(param); 
      } 
     } 


    }); 

}, 

的一点是你送这个“ GLOBAL.response_function,{is_return_callback:真正}”,由过去的功能,应执行查询

module.exports.insertIntoTempCalc: function(validateParam){ 
     var strSQL = "INSERT INTO ....."; 
     //some transformations here from other tables 

     util.executeQuery(strSQL,'INSERTION','[Tbl_TempCalcData]',GLOBAL.response_function, {is_return_callback:true}); 
    }, 
+0

cli的值没有在任何地方使用,它只是用于返回语句。此外,它不会在代码中产生任何错误。您可以请分享一个样本,了解如何在回调中传递res.send(cli)可以提供帮助,它的语法如何? –

+0

所以你可以检查更新。让我知道是否有问题 –

0

如果其他功能正常工作,这将解决该问题:

NodeJS: Router 
    router.post('/validate',function(req,res){ 
     var paramlist = req.body.paramList; 
     var fileName = req.body.fileName; 
     var cli = modImport.parseFile(fileName,paramlist,function(){ 
      res.send(cli); 
     }); 
    }); 

    //Import module: modImport.js 
    module.exports.executeQuery = function(strSQL, operationType, tableName, cb, param) { 
     logger.log('debug','running query: '+strSQL); 

     var request = new sql.Request(connection); 
     request.query(strSQL,function(err, recordset) { 
      if(err){ 
       logger.error('ERROR in '+operationType+' ON '+tableName+': '+err); 
      } 
      logger.info(operationType+' ON '+tableName+' successful!'); 
      if(cb){ 
       cb(param); 
      } 
     }); 

    }, 

    module.exports.parseFile: function(filePath, validateParam,callback){ 
     sql.connect(config).then(function() { 
      var arr = []; 
      arr.push(data);arr.push(validateParam); 
      arr.push(tName); 

      var delQ = "DELETE FROM [Tbl_TempData]"; 
      util.executeQuery(delQ,'DELETION','[Tbl_TempData]', module.exports.bulkImportIntoTempData, arr); 

      console.log("deletion completed"); 
      callback() 

     }).catch(function(err) { 
      logger.error('other error: '+err); 
      callback() 
     }); 
    }, 

    module.exports.bulkImportIntoTempData: function(arr){ 
     var data = arr[0]; 
     var validateParam = arr[1]; 
     var tName = arr[2]; 

     var bInQ = "INSERT INTO [Tbl_TempData] (field1,field2,field3) VALUES "; 
     data.forEach(function(rec, index){ 
      var keys = Object.keys(rec); 
      var kLen = keys.length - 1; 

      keys.forEach(function(datum,cursor){     
       bInQ += "('" + datum + "','" + rec[datum] + "','" + tName + ")"; 
       if(cursor < kLen){ 
        bInQ += ","; 
       } 
      }); 
     }); 
     module.exports.executeQuery(bInQ,'BULK INSERTION','[Omni_TempSurveyData]',module.exports.processForTempCalc,validateParam); 
    }, 

    module.exports.processForTempCalc: function(validateParam){ 
     var strSQL = "DELETE FROM [Tbl_TempCalc]"; 
     util.executeQuery(strSQL,'DELETION','[Tbl_TempCalc]',module.exports.insertIntoTempCalc,validateParam); 
    }, 

    module.exports.insertIntoTempCalc: function(validateParam){ 
     var strSQL = "INSERT INTO ....."; 
     //some transformations here from other tables 
     util.executeQuery(strSQL,'INSERTION','[Tbl_TempCalcData]'); 


    }, 

    module.exports.insertIntoBlankCalc: function(validateParam){ 
     var strSQL = "INSERT INTO ....."; 

     util.executeQuery(strSQL,'INSERTION','[Tbl_BlankCalcData]'); 

     //TODO: return the ajax call 
    } 
相关问题