res.send()在功能代码在节点js中执行之前执行

时间:2017-05-24 09:59:54

标签: javascript mysql node.js express callback

我是节点js的新手。在我的应用程序中,我正在查询MySql数据库并处理并使用节点js查看处理结果。如果我的查询返回null数据,那么我会执行另一个查询并执行该过程。但是我的res.send(finaldate)代码在功能处理完成之前执行。怎么解决这个问题。 res.send(finaldata)首先在"执行最终数据之前执行#34; ;

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

  });
 }

});

4 个答案:

答案 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 :(得分:1)

在if和else条件

中使用res.send
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);
                })
            }
        });
    }
});

答案 2 :(得分: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
   })
}

答案 3 :(得分:0)

虽然接受的答案肯定是正确的,但我个人觉得在语法上更容易将查询命令包装到Promise()中,即:

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

从技术上讲,任何你能用承诺完成的事情都可以通过回调完成;我发现将事物封装为承诺更容易。