更新模块中的变量值

时间:2017-07-06 15:52:30

标签: node.js node-mysql

我是node.js中的一个真正的新手,所以请理解我可能的愚蠢

我尝试使用外部文件作为模块,因此我可以在其他文件中使用它。该项目比这更大,但让我们说我的模块是:

var Tools = module.exports = {
  result_arr: [],
  object_data: {
    times  : [],
    temps1 : [],
    temps2 : [],
    temps3 : [],
    temps4 : [],
    levels : [],
    flows  : []
  },
  getLastNRows: function (whereIsData, DB_info, table, NRows) {
    if (whereIsData == "MySQL") {
      function setValue (value) {
        Tools.result_arr = value;
      }
      function dataArray2Object (array_data) {
        Tools.object_data.times  = array_data.map(row => row.timestamp);
        Tools.object_data.temps1 = array_data.map(row => row.temp1);
        Tools.object_data.temps2 = array_data.map(row => row.temp2);
        Tools.object_data.temps3 = array_data.map(row => row.temp3);
        Tools.object_data.temps4 = array_data.map(row => row.temp4);
        Tools.object_data.levels = array_data.map(row => row.level_ice_bank);
        Tools.object_data.flows  = array_data.map(row => row.flow);
      }
      var queryString = "SELECT timestamp, temp1, temp2, temp3, temp4, level_ice_bank, flow FROM " +
                        table + " ORDER BY id DESC LIMIT " + NRows + ";";
      var connnection = mysql.createConnection(DB_info);
      connnection.connect(function(err) {
        console.log("connected");
        if (err) throw err;
      });
      connnection.query(queryString, function (err, rows) {
        console.log("queried");
        if (err) throw err;
        setValue(rows);
        dataArray2Object(Tools.result_arr);
        console.log(Tools.result_arr);
        console.log(Tools.object_data);
      });
    }
    else {
      console.log("Function only accepts data stored in MySQL.\n(u still have to improve...)");
      return;
    }
};

变量object_data应该用在主文件中。这样,每当我致电getLastNRows时,我都希望object_data中的操作更新getLastNRows。主文件是:

var tools = require('./tools');

var where2save = "MySQL";
var info_db = {
  host    : "127.0.0.1",
  user    : "root",
  password: "xxxx",
  database: "mydb",
  port    : 3306
};
var table = "tempdata";
var NRows = 4;

tools.getLastNRows(where2save, info_db, table, NRows);

console.log(tools.object_data);

实际观察到的是,实际上,tools.object_data未在主文件中由getLastNRows更新,尽管来自tools.js(模块)文件的console.log(Tools.object_data);会记录更新的值。所以我的问题是:

如何在主文件中更新getLastNRows tools.object_data(创建时为空)?

1 个答案:

答案 0 :(得分:0)

getLastNRows是否异步?因为在我看来,这就是问题的原因。

它调用main中的getLastNRows,然后调用connection.query,它将被放置在工作线程上,然后立即继续console.log,其中tools.object_data尚未更新。

尝试:

getLastNRows: function (whereIsData, DB_info, table, NRows, cb) {
    // ...
    connnection.query(queryString, function (err, rows) {
            console.log("queried");
            if (err) throw err;
            setValue(rows);
            dataArray2Object(Tools.result_arr);
            console.log(Tools.result_arr);
            console.log(Tools.object_data);
            cb()
    });
    // ...
}

// in main
tools.getLastNRows(where2save, info_db, table, NRows, function() {
    console.log(tools.object_data);
});