我试图根据在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
}
阿贾克斯完成后,用户将被重定向到从最后插入表中加载数据的页面。但是由于在最终插入之前弹出警报,因此重定向的页面对用户显示为空白。 请建议如何克服这种情况。
请分享您的服务器端代码! – farhadamjady
@farhadamjady从注释开始的代码// NodeJS:Router是这个服务器端的代码 –