【问题标题】:res.send() execute before the functionality code executes in node jsres.send() 在节点 js 中执行功能代码之前执行
【发布时间】:2017-05-24 09:59:53
【问题描述】:

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

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

  });
 }

});

【问题讨论】:

    标签: javascript mysql node.js express callback


    【解决方案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
                    })
                }
    
            });
        }
    
    });
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您只需将 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
           })
        }
        

        【讨论】:

          【解决方案4】:

          虽然接受的答案肯定是正确的,但我个人认为将查询命令包装到 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);
          

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

          【讨论】:

            猜你喜欢
            • 2016-12-25
            • 2021-08-14
            • 2012-11-18
            • 2017-01-19
            • 1970-01-01
            • 2013-04-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多