首页 > 解决方案 > 如何从回调函数中修改全局变量。在 node.js 中

问题描述

在 node.js 中,我想将 mysql 查询的结果存储在全局变量中,以便我可以将其导出或将其记录到控制台,但似乎全局变量没有从回调函数中修改,那又如何呢?可以做 ?请帮忙,tgis是我的简单代码

    var mysql = require("mysql");
var text = "begin : ";
var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "",
  database: "ajax",
});
con.connect(function (err) {
  if (err) throw err;

  var sql = "SELECT * FROM `nom`";
  con.query(sql, function (err, result) {
    if (err) throw err;

    result.forEach((row) => {
      text +=
        "  the first is : " +
        row.first +
        " and the second is : " +
        row.second +
        "\n";
    });
  });
  con.end();
});

console.log(text);

标签: javascriptmysqlnode.jsfunctionglobal-variables

解决方案


您当前的代码不是完全同步的,即第 1 行、第 2 行和第 3 行可以作为第 1 行、第 3 行、第 2 行执行。您的代码是异步的,因为您有一个con.connect使用回调的调用(即它将调用您提供的函数当它试图连接到您的 mysql 数据库时)。如果您想在连接后打印文本,则不建议使用全局变量,或者更准确地说,将您console.log(text);放在代码的末尾,因为console.log(text);之前可能运行的可能con.connect已尝试连接到您的数据库。因此,以下是针对此特定示例的一项建议:

var mysql = require("mysql");
var text = "begin : ";
var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "",
  database: "ajax",
});
con.connect(function (err) {
  if (err) throw err;

  var sql = "SELECT * FROM `nom`";
  con.query(sql, function (err, result) {
    if (err) throw err;

    result.forEach((row) => {
      text +=
        "  the first is : " +
        row.first +
        " and the second is : " +
        row.second +
        "\n";
    });
    console.log(text); 
    //write code to export to file/remote service here
  });
  con.end();
});


Javascript Function Scope是我已经链接到的另一个特殊兴趣,并且有许多资源可以描述和探索这一点。建议在您未来的代码中,特别是因为您正在使用异步代码,您尝试本地化或在您的函数范围内工作,并避免使用将在不同时间由不同函数修改的全局变量,这可能难以预测和因此会认为您的项目/代码“不可预测”。


推荐阅读