2013-03-12 86 views
0

我对nodejs很新颖。如何阻止查询结果的nodejs

我希望我的代码能够多次查询数据库,从一个变量中的所有查询中收集数据,然后在某处使用它。

但我猜nodejs而不是等待查询的结果,执行没有阻塞。 这是我认为正在发生的事情。对不起,如果我错了。

for (var i = step_min; i < (step_max); i += step) { 
    query = 'select count(' + colName + ') as num_count from ' + 
     rows[0].tablename + ' where ' + 'dictionaryid=' + 
     rows[0].dictionaryid + ' and ' + colName + ' between ' + i + 
     ' and ' + (i + step); 

    connection.query(query, function(err, rows1, fields) { 
     if (err) { 
      console.log(err); 
      throw err; 
     } 

     try { 
      console.log("$$$$$$$$$$$$$$$ pushed : "+ rows1[0].num_count); 
      contents.push(rows1[0].num_count); 
      console.log('contents : '+ contents+'\n');       

     } catch (e) { 
      if (e instanceof SyntaxError) { 
       console.log("Syntax Error for input function"); 
      } 
     } 

    }); 

    console.log("##################### " + query + "\n"); 

    console.log('contents : '+ contents+'\n'); 
} 

任何意见,无论是在如何阻止直到的NodeJS从查询结果中获得或以其他方式重组我的代码?

在此先感谢。

+0

关于这个话题有很多关于SO的问题,并且有很多可靠的解决方案。使用'block'或'synchronous'或'callback hell'等术语在'[node.js]'标签中进行一些搜索:)。 – JohnnyHK 2013-03-12 04:08:37

回答

2

在执行之前,您没有在等待您的查询。您可以查看node-mysql-queues模块,您可以使用该模块排队查询,并在所有执行完毕后执行给定回调(它也将允许您执行交易)。您正在执行的查询数量。在每个事务的回调中,将结果保存到您的返回对象中并递减计数器。如果它是< = 0,那么你的所有查询都已经完成,你可以用返回对象执行主回调。

另外,请注意SQL注入。

+0

谢谢尼克,那样做... – 2013-03-12 05:03:50

0

做下面的事情可能是一个解决办法。

//它只是一个测试什么来铭记第一,所以我会调整它后...

 var contents = []; 

     var lock = 0; 

     for (var i = step_min; i < (step_max + step); i += step) { 
      lock++; 
     } 

     for (var i = step_min; i < (step_max + step); i += step) { 
      query = 'select count(' + colName + ') as num_count from ' + rows[0].tablename + ' where ' + 'dictionaryid=' + rows[0].dictionaryid + ' and ' + colName + ' between ' + i + ' and ' + (i + step); 

      connection.query(query, function(err, rows1, fields) { 
       if (err) { 
        console.log(err); 
        throw err; 
       } 

       try { 
        console.log("$$$$$$$$$$$$$$$ pushed : " + rows1[0].num_count); 
        contents.push(rows1[0].num_count); 
        console.log('contents : ' + contents + '\n'); 

       } catch (e) { 
        if (e instanceof SyntaxError) { 
         console.log("Syntax Error for input function"); 
        } 
       } 

       lock--; 

       if (lock == 0) { 
        queryDone(); 
       } 

      }); 

     } 

     function queryDone() { 


      console.log("##################### " + query + "\n"); 

      console.log('contents : ' + contents + '\n'); 


      var id = obj.exptID + '.' + obj.exptITR + '.' + obj.nodeID + '.' + obj.resourceName + '.' + colName; 
      serie = { 
       name: colName, 
       data: contents, 
       id: id 
      }; 



      console.log("--------------------\n " + step_max + "\n" + step_min + "\n------------------------\n"); 
     } 

的方法是火的功能,当尼克说,所有查询都做代码.. 。

1

试试这个: https://github.com/luciotato/waitfor

你的代码wait.for:

for (var i = step_min; i < (step_max); i += step) { 
    query = 'select count(' + colName + ') as num_count from ' + 
     rows[0].tablename + ' where ' + 'dictionaryid=' + 
     rows[0].dictionaryid + ' and ' + colName + ' between ' + i + 
     ' and ' + (i + step); 

    var rows1 = wait.forMethod(connection,"query",query); //waits until callback 
    console.log("$$$$$$$$$$$$$$$ pushed : "+ rows1[0].num_count); 
    contents.push(rows1[0].num_count); 
} 
console.log("##################### " + query + "\n"); 
console.log('contents : '+ contents+'\n'); 

} catch (e) { 
      if (e instanceof SyntaxError) { 
       console.log("Syntax Error for input function"); 
      } 
      .... 
     }