我正在做一個監控系統項目,在該項目中,我將Arduino傳感器數據發送到node.js服務器(通過GET請求),然後存儲在MySQL數據庫中。將mysql查詢行存儲在變量中供以後使用
當我成功發送數據到服務器時,它連接到MySQL數據庫,並查詢最近5個收到的記錄做一些處理。
因此,我需要將這5條記錄的行存儲在一個變量中供以後使用。這意味着我必須從變量中的connection.query獲取行。
我讀到,我無法做到這一點的事實是因爲node.js是異步的。所以我的問題是:
- 是否有可能以我嘗試的方式完成描述的任務?
- 如果沒有,是否還有其他方法可以這樣做?
我沒有把整個代碼放在這裏,但我正在運行一個單獨的測試,也不能正常運行。那就是:
var mysql = require('mysql');
var con = mysql.createConnection({
host : "127.0.0.1",
user : "root",
password: "xxxx",
database: "mydb",
port : 3306
});
var queryString = "SELECT id, temp1, temp2, temp3, temp4, level_ice_bank, flow FROM tempdata ORDER BY id DESC LIMIT 5";
con.connect(function(err) {
if (err) throw err;
});
var result_arr = [];
function setValue (value) {
result_arr = value;
}
con.query(queryString, function (err, rows, fields) {
if (err) throw err;
else {
//console.log(rows);
setValue(rows);
}
});
console.log(result_arr);
它記錄:
[]
但是,如果我去掉console.log(rows);
它會記錄什麼,我需要在變量result_arr
存儲。
在此先感謝大家。
線程不會等待con.query完成。它會在執行con.query行後立即執行console.log(result_arr),這就是爲什麼沒有記錄任何值,因爲con.query還沒有完成查詢。取消註釋後,您會得到一個結果//console.log (rows);因爲con.query完成了它的執行。將它視爲con.query執行時,會創建一個新線程來運行它的執行,並且主線程將繼續其生命,即使con.query尚未完成。 – suguspnk
@suguspnk謝謝你的解釋!我或多或少地理解它必須是這樣的。你知道我該怎麼做'setValues(rows);'在console.log(result_arr);'之前發生嗎? – arocha
請看dan的回答。這是正確的方法。 – suguspnk