两个循环,而不是连接到Mysql

时间:2015-07-20 16:13:22

标签: javascript mysql node.js

我是Node Js的新手。我必须使用Mysql。 我安装了mysql模块,我必须读取第一个数据库中表的数据,然后写入第二个数据库的另一个表。 问题:在第二个函数calculBalance中,函数构建查询 但不要执行查询。在第一个函数中完成循环后,调用第二个函数并执行带有错误参数的查询 我不明白为什么我有2个循环而不是一个? 谢谢你的帮助

代码:

router.post('/launch',syncData);

// First function
function syncData(req,res){
// First connection
//Fill an array
    for (var key in usersData){
        if (usersData.hasOwnProperty(key)){
        // Call a 2nd function
            var resultCalculBalance=calculBalance(JSON.stringify(usersData[key]));
               console.log('Results  ->' + JSON.stringify(resultCalculBalance));
            }
        }
}

在第二个函数中,我连接到第一个数据库的第二个表来搜索值 //第二个功能

function calculBalance(userData,req,res,err){
        var resultCalcBalance=0;
        var calcul_balance = "select sum(amount) as amount from ( SELECT sum(jjt.amount) as amount" +
            " FROM jos_joomrh_training_employee_hours_history jjt,jos_joomrh_event je,jos_joomrh_log jl " +
            " where je.id=jjt.event_id and je.id=jl.item_id and deleted_at is null " +
            " and user_id= " + userData.id + " and category_id= " + cat_id + " and date_format(je.date,'%Y-%m-%d')" + comp + dateJour +
            " union all SELECT sum(amount) as amount FROM jos_joomrh_training_employee_hours_history " +
            " where event_id is null and user_id=" + userData.id + " and category_id=" + cat_id + " ) as z group by amount ";
        console.log(calcul_balance);
        connectionMysql.query(calcul_balance,function(err,rows,fields){
            if(err){
                console.log('Error ' + err);
                return err;
            }
            console.log('calculData : ' + rows.length);
            if (rows.length != 0) {
    // somethings
return tabBalance;
}// end of the function

2 个答案:

答案 0 :(得分:0)

这里的问题是你有一个函数可以进行回调但不接受回调。这意味着您的syncData函数在查询运行之前就已完成。

你需要做的是允许calculBalance函数进行回调,然后在时间链接回来。典型的模式:

function calculBalance(userData, cb) {
  db.query(sql, function(err,rows,fields) {
    if(err) {
      cb(err);
    }

    if (rows.length != 0) {
      cb(null, rows);
    }
  });
}

来自异步函数的任何return都无处可去,所以不要费心去做。从中获取数据的唯一方法是将其传递给您已经给出的回调。

现在修复了这个问题,你需要让调用者在循环中进行异步调用。我更喜欢使用promise库解决此问题,您可以在列表中执行Promise.allPromise.map。如果您正在使用回调,请使用async库。

答案 1 :(得分:0)

和你一样,我最近开始学习nodejs。从串行开发背景来看,nodejs可以成为一种心理上的范式转换。

我发现使用promises允许我更好地依赖控制流而不仅仅是回调。承诺解析为完成或错误。它就像java中的try-catch块。我发现更有帮助。

我的两分钱..