2016-09-30 29 views
1

我發現了ExpressJS guide如下:異步在Express中如何工作?

var mysql  = require('mysql'); 
var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'dbuser', 
    password : 's3kreee7' 
}); 

connection.connect(); 

connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) { 
    if (err) throw err; 
    console.log('The solution is: ', rows[0].solution); 
}); 

connection.end(); 

這難道不應該是不好的做法?我看到它的方式,連接可能會在執行查詢之前結束。這不會給出錯誤嗎?

回答

1

如前所述here

  • 你的連接上調用的每個方法進行排隊並依次執行。

  • 關閉連接是使用end()來完成的,它確保在發送退出數據包到mysql服務器之前執行所有剩餘的查詢。

因此,即使可以查詢完成之前進行調用的end()方法,它實際上不會執行,直到查詢已完成執行。

對於mysql包,這必須比NodeJS本身做得更多。

+0

當然,但回調不會有發生 - 這將發生在'結束'後 - 所以我會認爲這是不好的代碼 – Soren

+0

沒有關係,如果回調沒有發生,你打電話'end()'當你完成SQL操作時,它不會阻止你以前的查詢運行。無論是否你認爲這個糟糕的代碼取決於你,但它不會像問題中提到的那樣「給出一個錯誤」。 – Drown

+0

那麼如果回調代碼創建一個新的查詢會發生什麼? – Soren

0

您的問題異步在Express中如何工作?這不應該是不好的做法?可以用很多方式回答,但爲了清晰起見,我想解釋一下,這取決於!

一般是非常不好的做法,假設你不知道實際執行。

如果這個實現非常簡單,那麼它的確如你所要求的那樣 - 即當執行end時關閉或結束連接,那麼它可能會導致相當醜陋的競爭條件,它可能會或可能不會工作,具體取決於機器的負載。

然而,一個聰明的實現,它引用計數 - 這是end實際上並不關閉連接,但只是設置一個標誌說 - 「時的最後一個回調完成後關閉」 - 那麼它可能工作。

如果它使用引用計數實現的mysql連接器,那麼這可能會正常工作 - 但這不同於說作爲插件找到的所有內容都是很好的做法。