节点在函数

时间:2015-10-26 02:16:13

标签: javascript node.js node-mysql

我使用node-mysql来执行查询并返回结果。根据标准的mysql-node文档,一旦查询完成,就会在传递错误对象或结果对象时执行回调函数。假设查询正确执行(确实如此)。我在结果上运行for-in循环,并将每行中的字段分配为一条连续的消息,我计划将其发送回调用,以便可以对其进行适当处理。因此,如果用户想要查看幻想足球选秀中的最后5个选秀权,则该功能将接收num参数(等于5),然后查看返回的消息,其中显示有关所有5个选秀权交易的详细信息。功能如下:

exports.getSelections = function(num){


 var query = "Select b.Player, b.Team, b.Position, a.Pick, c.Owner FROM Players b, Owners c,(Select * FROM Draft2 WHERE Year=2015 AND Player_ID >0 ORDER BY PICK DESC LIMIT " + num + ") a WHERE b.Player_ID = a.Player_ID AND c.Owner_ID = a.Owner_ID ORDER BY a.Pick DESC";


 var connection = mysql.createConnection(EXTERNAL_DATABASE_URL);
 connection.query(query, function(err, results, fields){
                    if(!err){
                        for( var i in results){
                            msg += "\n" + results[i].Pick + ". " + results[i].Owner + " selected " + results[i].Player + ",  " + results[i].Position + " from " + results[i].Team 
                        }

                    }else{
                        console.log(err);
                            msg = "There was an error processing your request";
                    }
                });      


                    connection.end(function(err){
                        if(err){
                            console.log("there was an error")
                        }else{
                            console.log("close connection");
                        }
                    });




                        console.log("message to be sent: " + msg);
                        return msg;         

};

通过我的控制台的输出总是:

要发送的消息:未定义

这是处理过的内容: [根据传递给函数并在查询中使用的数字显示销售交易的详细信息]

我在上面的第二行中看到了查询的结果,如[msg]所示,所以我知道查询已正确执行。

以下是我的问题:

  1. 我可以在完成实际循环之前解释为什么控制台会执行要发送的消息

  2. 如果我想在返回值之前确保循环完成,我该如何处理?

  3. 此外,看来connection.end也没有执行。我认为我太早退出这个功能了?

  4. 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

正如@Pointy暗示的那样,日志在循环完成之前正在执行,因为数据库操作connection.query异步。所有操作都按正确的顺序执行;只是异步操作在他们自己的时间轴上解析,这就是为什么我们有完成后运行的回调。

msg回调甚至有机会运行之前,您已经记录了connection.query的值。

尝试在console.log操作的回调中移动“要发送的消息”connection.query

exports.getSelections = function(num) {
  var query = "Select b.Player, b.Team, b.Position, a.Pick, c.Owner FROM Players b, Owners c,(Select * FROM Draft2 WHERE Year=2015 AND Player_ID >0 ORDER BY PICK DESC LIMIT " + num + ") a WHERE b.Player_ID = a.Player_ID AND c.Owner_ID = a.Owner_ID ORDER BY a.Pick DESC";
  var connection = mysql.createConnection(EXTERNAL_DATABASE_URL);
  connection.query(query, function(err, results, fields) {
    if (!err) {
      for (var i in results) {
        msg += "\n" + results[i].Pick + ". " + results[i].Owner + " selected " + results[i].Player + ", " + results[i].Position + " from " + results[i].Team
      }
    } else {
      console.log(err);
      msg = "There was an error processing your request";
    }

    console.log("message to be sent: " + msg);

  });
  connection.end(function(err) {
    if (err) {
      console.log("there was an error")
    } else {
      console.log("close connection");
    }
  });

  return msg;
};

另外,在与msg连接之前,可能需要确保String的类型为msg += "..."