2015-11-30 153 views
3

我目前正在開發一個使用NodeJS的應用程序。NodeJs mysql錯誤ETIMEDOUT

但是,服務器往往會拋出這個錯誤,我無法與mysql進行交互。

[Error: read ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'read', fatal: true } { [Error: Cannot enqueue Query after fatal error.] code: 'PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR', fatal: false }

有人有一個解決方案,以定勢呢?

感謝

+0

你嘗試只是重新連接(假設的問題是,連接丟失)? – mscdex

+0

這實際上是兩個單獨的錯誤。 對於第二種情況,這是正常行爲,因爲一旦發生致命錯誤時您嘗試在連接上進行查詢時就會發生這種情況。 您可能正在調用連接上的某個方法,如之前在代碼中的查詢,並且意外不會檢查返回的錯誤。另一種可能性是您正在檢查錯誤,但不檢查err.fatal是否爲true並放棄連接。 – Gary

+0

嘿,你可能已經在一些其他文件中建立了連接,你必須在app.js中需要這些文件,並且會在app.js或任何其他你也包含的文件中執行查詢。在連接之前或在連接對象中發生錯誤之後,您仍然在進行查詢。 –

回答

2

從你的問題,我認爲你可以用你的數據庫工作完美,但這個錯誤是連接一個給定的時間後,經常發生往上衝......

假設你正在使用node-mysql
來源:https://github.com/felixge/node-mysql#error-handling
你的錯誤而終止您連接到數據庫:

err.fatal:布爾值,指示此錯誤是否是連接對象的終端。
如果錯誤不是來自MySQL協議操作,則不會定義此屬性。

注意:'錯誤'事件在節點中是特殊的。如果它們在沒有附加監聽器的情況下發生,則會打印堆棧跟蹤,並且您的進程被終止了 。

tl; dr:此模塊不希望您處理無提示失敗。您應始終爲您的方法調用提供回調。如果你想 忽略了這個建議,並抑制未處理的錯誤,你可以這樣做:

// I am Chuck Norris: 
connection.on('error', function() {}); 

從這裏就可以檢查連接狀態,並在必要時進行重新連接。


您也可以嘗試手動連接到你的MySQL服務並更改請求超時:

wait_timeout」 : the amount of seconds during inactivity that MySQL will wait before it will close a connection on a non-interactive connection in seconds. 

http://www.serveridol.com/2012/04/13/mysql-interactive_timeout-vs-wait_timeout/
https://support.rackspace.com/how-to/how-to-change-the-mysql-timeout-on-a-server/