2017-05-24 41 views
1

我是节点js的新手。在我的应用程序中,我正在查询MySql DB并使用节点j处理并查看处理后的结果。如果我的查询返回空数据,然后我做另一个查询并执行该过程。但是,我的res.send(finaldate)代码在功能过程完成之前得到执行。如何解决这个问题。 res.send(finaldata)在“do require stuff for finaldata”之前执行;res.send()在功能代码在节点js中执行之前执行

var finaldata ={}; 
//first query 
var result = connection.query('myquery', function(err, data_rows){ 
if(!err){ 
    //second 
    //doing one more Query for some other records from DB (second query) 
    connection.query('myquery', function(err, rows, fields){ 
    if(0 < rows.length){ 
    finaldata = //do require stuff for finaldata 
    } 
    else{ 
     //third 
     //do the second query with some condition 
     connection.query(queryText, function(err, rows, fields) { 
      finaldata = //do require stuff for finaldata 
     }) 
    } 
res.send(finaldata); 

    }); 
} 

}); 

回答

0

你需要简单地移动res.send()调用到第二查询这样的回调:

connection.query('myquery', function(err, rows, fields){ 
if(0 < rows.length){ 
    finaldata = //do require stuff for finaldata 
    res.send(finaldata); //<---If data 
} 
else{ 
    //third 
    //do the second query with some condition 
    connection.query(queryText, function(err, rows, fields) { 
     finaldata = //do require stuff for finaldata 
     res.send(finaldata); // <--- If no data 
    }) 
} 
+0

感谢它的工作 –

1

欢迎和的NodeJS异步计算的世界!

问题是res.send在第二个connection.query完成之前执行。为了解决这个问题,你把res.send放在回调中。

var result = connection.query('myquery', function(err, data_rows) { 
    if (!err) { 
     //second 
     //doing one more Query for some other records from DB (second query) 
     connection.query('myquery', function(err, rows, fields) { 
      if (0 < rows.length) { 
       // do something 
       res.send(/* send something*/); 
      } else { 
       //third 
       //do the second query with some condition 
       connection.query(queryText, function(err, rows, fields) { 
        // do something 
        res.send(/*send something*/); // 2nd res.send 
       }) 
      } 

     }); 
    } 

}); 
1

使用res.send在if和else条件

var finaldata = {}; 
var result = connection.query('myquery', function(err, data_rows) { 
    if (!err) { 
     connection.query('myquery', function(err, rows, fields) { 
      if (0 < rows.length) { 
       finaldata = //some value 
       res.send(finaldata); 
      } else { 
       connection.query(queryText, function(err, rows, fields) { 
        finaldata = //some value 
        res.send(finaldata); 
       }) 
      } 
     }); 
    } 
}); 
0

虽然接受的答案肯定是正确的,我个人觉得这句法更容易包裹查询命令到无极(),即:

connection.queryPromiser = function(sql, args) { 
    return new Promise(function(resolve, reject) { 
     connection.query(
      sql, 
      args, 
      function(err, results, fields) { 
       if (err) { 
        reject(err); 
       } else { 
        resolve({"results": results, "fields": fields}); 
       } 
      } 
     ); 
    }); 
}; 

然后你就可以完成你res.send像这样:

connection.queryPromiser("SELECT id FROM users WHERE username = ?", [ "Sami" ]) 
.then(function(data) { 
    if (data.results.length) { 
     return connection.queryPromiser("SELECT * FROM user_data WHERE user_id = ?", [ data.results[0].id ]) 
     .then(function(data) { 
      if (data.results.length) { 
       return data.results[0]; 
      } else { 
       return "no user_data"; 
      } 
     }); 
    } else { 
     return "no user"; 
    } 
}).then(res.send) 
.catch(console.error); 

从技术上讲,任何你可以用承诺完成的事情都可以用回调来完成;我只是觉得把事情封装成承诺更容易。