簡體   English   中英

異步如何在 Express 中工作?

[英]How does async work in Express?

我在ExpressJS 指南中發現了以下內容:

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

這不應該是不好的做法嗎? 在我看來,連接有可能在執行查詢之前結束。 那不會報錯嗎?

如前所述這里

  • 您在連接上調用的每個方法都會排隊並按順序執行。

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

因此,即使可以在查詢完成之前調用end()方法,它也不會在查詢完成執行之前實際執行。

這與mysql包比 NodeJS 本身有更多關系。

您的問題async 在 Express 中是如何工作的? 這不應該是不好的做法嗎? 可以通過多種方式回答,但為了清楚起見,我想解釋一下這取決於!!!!

假設您不知道實際實現,這通常是非常糟糕的做法。

如果實現真的很簡單,它完全按照您的要求執行 - 即在執行end時關閉或結束連接,那么它可能會導致相當丑陋的競爭條件,根據機器的負載它可能會或可能不會工作.

然而,一個進行引用計數的聰明實現——即end實際上並沒有關閉連接,而只是設置一個標志來說明——“當最后一個回調完成后關閉”——那么它可能會起作用。

如果它使用引用計數來實現 mysql 連接器,那么這可能會很好地工作 - 但這並不等於說它是作為插件找到的所有東西的好習慣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM