0
我在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
主文件更新,雖然console.log(Tools.object_data);
從tools.js(模塊)的文件將記錄更新的值。所以我的問題是:
我怎樣才能讓getLastNRows
更新tools.object_data
主文件(裏面是空的創建時)?
它可能是異步的(至少'connection.query()'是異步)。無論如何,在執行下一條代碼行之前,要等待getLastNRows完成嗎? – arocha
我剛剛提供了一個應用程序代碼片段的更新。您需要將回調傳遞給'getLastNRows'。如果您沒有使用舊的節點版本,您可能需要查看'Promises'或'async/await'。 – RNikoopour
非常感謝,您的代碼正常工作!我知道你回答了我提出的問題,但這不完全是我真正需要的。我真正需要的是將'tools.object_data'存儲在下一行使用的變量中(例如'var foo = tools.getLastNRows(where2save,info_db,table,NRows,function(){return tools.object_data;} );') 或 下一行代碼剛剛在'tools.object_data'的值更新時執行。 你能幫助我嗎? – arocha