node-mysql: connect時的”Cannot enqueue Handshake after already enqueuing a Hand shake”錯誤


events.js:160
      throw er; // Unhandled 'error' event
      ^


Error: Cannot enqueue Handshake after invoking quit.
    at Protocol._validateEnqueue (D:\bookstore\node_modules\mysql\lib\protocol\Protocol.js:202:16)
    at Protocol._enqueue (D:\bookstore\node_modules\mysql\lib\protocol\Protocol.js:135:13)
    at Protocol.handshake (D:\bookstore\node_modules\mysql\lib\protocol\Protocol.js:52:41)
    at Connection.connect (D:\bookstore\node_modules\mysql\lib\Connection.js:130:18)
    at D:\bookstore\build\dev-server.js:50:14
    at Layer.handle [as handle_request] (D:\bookstore\node_modules\_express@4.15.3@express\lib\router\layer.js:95:5)
    at next (D:\bookstore\node_modules\_express@4.15.3@express\lib\router\route.js:137:13)
    at Route.dispatch (D:\bookstore\node_modules\_express@4.15.3@express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (D:\bookstore\node_modules\_express@4.15.3@express\lib\router\layer.js:95:5)
    at D:\bookstore\node_modules\_express@4.15.3@express\lib\router\index.js:281:22
    at param (D:\bookstore\node_modules\_express@4.15.3@express\lib\router\index.js:354:14)
    at param (D:\bookstore\node_modules\_express@4.15.3@express\lib\router\index.js:365:14)
    at Function.process_params (D:\bookstore\node_modules\_express@4.15.3@express\lib\router\index.js:410:3)
    at next (D:\bookstore\node_modules\_express@4.15.3@express\lib\router\index.js:275:10)
    at Function.handle (D:\bookstore\node_modules\_express@4.15.3@express\lib\router\index.js:174:3)
    at router (D:\bookstore\node_modules\_express@4.15.3@express\lib\router\index.js:47:12)


原文地址 https://www.mgenware.com/blog/?p=2924&utm_source=tuicool&utm_medium=referral


本文測試環境: Node.js 4.2.2, node-mysql 2.9.0

使用node-mysql遇到Cannot enqueue Handshake after already enqueuing a Hand shake。這個錯誤提示意思是某個數據庫連接已經執行了,不能進行多次連接了。遇到此類情況,首先看下代碼是否出現了同一個數據庫連接多次調用connect方法的情況,這種明顯的錯誤排除后,看看是否在調用connect前發生了隱式的連接操作,比如在未連接時直接調用query做查詢會間接去connect,如下代碼,createConnection后直接調用query也會觸發連接:

var mysql = require('mysql');
mysql.createConnection({...}).query('...', (err, res) => {
    if (err) {
        // 處理錯誤
    }
    // 隱式連接,沒有連接錯誤的話,數據會正常返回
});

當然,也可以直接去掉顯式的connect調用,任由query去做隱式連接,也不會出現上述錯誤,不過如果這樣的話,強烈建議使用Pool,這樣數據庫連接可以最大化的實現復用和管理,和createConnection返回的連接一樣,Pool可以通過getConnection返回一個連接,也可以直接用query去自動復用或創建一個連接。不過如果使用pool.getConnection的話,記得用完連接后調用connection.release把連接返回給Pool。這兩種方式多數情況下是等價的,除非查詢包含多個語句,可以參考這個鏈接:Difference between using getConnection() and using pool directly in node.js with node-mysql module?.



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM