繁体   English   中英

只有在nodejs路由器上完成所有事务后,才返回到ajax调用

[英]Return to ajax call only after all transactions are completed on nodejs router

我正在尝试对节点页面进行ajax调用,该节点页面根据ajax调用中传递的参数对数据库执行一些操作。 我面临的问题是,该控件被传递回html页面(我正在使用警报来测试请求完成),该页面甚至在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
}

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

如果我是对的,那么“ modImport.parseFile”函数不会返回任何内容,而只是在promise中调用“ 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:true}”

   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});
    },

如果其他功能运行正常,将解决问题:

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
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM