更新模块中的变量值
Update variable value in module
我是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
(创建时为空)?
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);
});
我是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
(创建时为空)?
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);
});