2017-07-06 2 views
0

Ich bin ein echter Neuling in node.js so pls meine mögliche Dummheitaktualisieren Variablenwert in Modul

Ich verstehe ich versucht, eine externe Datei zu verwenden, als Modul zu dienen, damit ich in verwenden kann andere Dateien. Das Projekt ist größer als das, aber sagen wir mal mein Modul ist:

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; 
    } 
}; 

Die Variable object_data soll in einer Hauptdatei verwendet werden. Auf diese Weise erwarte ich, dass ich getLastNRowsobject_data durch die Operationen in getLastNRows aktualisiert werde. Die Hauptdatei wäre:

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); 

Was beobachtet wird, ist, dass in der Tat, tools.object_data nicht durch getLastNRows in der Hauptdatei aktualisiert wird, obwohl console.log(Tools.object_data); von dem tools.js (Modul) Datei protokolliert die aktualisierten Werte. Also meine Frage ist:

Wie kann ich getLastNRows update tools.object_data (die leer ist, wenn erstellt) in der Hauptdatei machen?

Antwort

0

Ist getLastNRows asynchron? Weil es mir scheint, ist das die Ursache des Problems.

Sie ruft die getLastNRows in Haupt die dann connection.query aufruft, die dann auf einem Worker-Thread gesetzt wird weiterhin sofort auf die console.log wo tools.object_data nicht aktualisiert wurde.

Versuchen:

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); 
}); 
+0

es wahrscheinlich ist async (zumindest 'connection.query()' ist async). Weißt du überhaupt, auf 'getLastNRows' zu warten, bevor die nächste Codezeile ausgeführt wird? – arocha

+0

Ich habe gerade ein Update mit einem Code-Snippet bereitgestellt, das funktionieren sollte. Sie müssen einen Callback an 'getLastNRows' übergeben. Vielleicht möchten Sie in "Versprechen" oder "Asynchron/Warten" schauen, wenn Sie nicht mit einer alten Knotenversion festgefahren sind. – RNikoopour

+0

Vielen Dank, Ihr Code hat funktioniert! Ich weiß, du hast geantwortet, was ich gefragt habe, aber das ist nicht genau das, was ich wirklich brauche. Was ich wirklich brauche, ist 'tools.object_data' in einer Variablen zu speichern, die in der nächsten Zeile verwendet wird (wie' var foo = tools.getLastNRows (where2save, info_db, table, NRows, function() {return tools.object_data;}); ') OR dass die nächste Codezeile gerade ausgeführt wird, wenn der Wert von' tools.object_data' aktualisiert wird. Können Sie mir dabei helfen? – arocha