2017-07-06 81 views
0

我正在做一個監控系統項目,在該項目中,我將Arduino傳感器數據發送到node.js服務器(通過GET請求),然後存儲在MySQL數據庫中。將mysql查詢行存儲在變量中供以後使用

當我成功發送數據到服務器時,它連接到MySQL數據庫,並查詢最近5個收到的記錄做一些處理。

因此,我需要將這5條記錄的行存儲在一個變量中供以後使用。這意味着我必須從變量中的connection.query獲取行。

我讀到,我無法做到這一點的事實是因爲node.js是異步的。所以我的問題是:

  1. 是否有可能以我嘗試的方式完成描述的任務?
  2. 如果沒有,是否還有其他方法可以這樣做?

我沒有把整個代碼放在這裏,但我正在運行一個單獨的測試,也不能正常運行。那就是:

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存儲。

在此先感謝大家。

+0

線程不會等待con.query完成。它會在執行con.query行後立即執行console.log(result_arr),這就是爲什麼沒有記錄任何值,因爲con.query還沒有完成查詢。取消註釋後,您會得到一個結果//console.log (rows);因爲con.query完成了它的執行。將它視爲con.query執行時,會創建一個新線程來運行它的執行,並且主線程將繼續其生命,即使con.query尚未完成。 – suguspnk

+0

@suguspnk謝謝你的解釋!我或多或少地理解它必須是這樣的。你知道我該怎麼做'setValues(rows);'在console.log(result_arr);'之前發生嗎? – arocha

+0

請看dan的回答。這是正確的方法。 – suguspnk

回答

1

您看到此行爲,因爲con.query(...)是異步函數。這意味着:

console.log(result_arr); 

運行前:

con.query(queryString, function (err, rows, fields) { 
    if (err) throw err; 
    else { 
    //console.log(rows); 
    setValue(rows); 
    } 
}); 

(具體來說,setValue(rows)電話)

要在你的榜樣解決這個問題,你可以這樣做:

con.query(queryString, function (err, rows, fields) { 
    if (err) throw err; 
    else { 
    setValue(rows); 
    console.log(result_arr); 
    } 
}); 

如果你想做的不僅僅是記錄數據,那麼你可以調用一個函數,這取決於result_arr來自con.query回調,像這樣:

con.query(queryString, function (err, rows, fields) { 
    if (err) throw err; 
    else { 
    setValue(rows); 
    doCleverStuffWithData(); 
    } 
}); 

function doCleverStuffWithData() { 
    // Do something with result_arr 
} 
+0

另外值得一提的是,可以將異步/等待功能添加到Node.js mysql模塊[帶有一些工作](https://github.com/mysqljs/mysql/issues/1755)。這也可以解決你的問題。希望對此的支持將在未來本地添加到mysql包中。 – dan

+0

你的解釋是完美的,它按照我的意願工作,我想我現在可以繼續與thr項目。謝謝! – arocha

+0

@AntónioRocha太棒了,我真的很高興它有幫助。 JavaScript中的異步/回調概念絕對值得讓你的頭在早期:) – dan

相關問題