我是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
答案 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.all
或Promise.map
。如果您正在使用回调,请使用async
库。
答案 1 :(得分:0)
和你一样,我最近开始学习nodejs。从串行开发背景来看,nodejs可以成为一种心理上的范式转换。
我发现使用promises允许我更好地依赖控制流而不仅仅是回调。承诺解析为完成或错误。它就像java中的try-catch块。我发现更有帮助。
我的两分钱..