標籤:
Node的mysql模組,本人的感受就是不好用,各種報錯,各種坑,有一個問題困擾了我很久,也不知道是不是我使用的方式不對,不過後來用easymysql模組解決了,我才深信這是一個坑。
問題描述:
假設有這麼一個資料表table,它有兩個欄位index和name,在localhost:3000首頁有一個按鈕,上面寫著“更新”,當我點擊更新後會POST到localhost:3000/update,然後後台串連資料庫進行更新操作每一條記錄的name為“gdt”,更新完畢後回到首頁,再重新按一下“更新”按鈕,就會報錯誤,如下:
“{ [Error: Cannot enqueue Query after invoking quit.] code: ‘PROTOCOL_ENQUEUE_AFTER_QUIT‘, fatal: false }”
下面代碼,省略了模組的引入以及資料庫的串連操作,我使用的是非同步流程式控制制Async來使得非同步查詢變成同步查詢,在流程結束的最後connection會end,路由會重新導向到localhost:3000,講道理的話當我重新按“更新”按鈕時會繼續進行更新操作,而不是報錯
exports.update = function(req, res) { //獲得需要所有記錄資訊 function getInfo() { return new Promise((resolve, reject) => { connection.query(‘SELECT `index`,`name` from table‘, function(err, result) { if (err) { console.log(err); } else { resolve(result); } }) }) } // 將每一項的名字更新為gdt function updateName(info) { return new Promise((resolve, reject) => { var index = info[‘index‘]; connection.query("UPDATE `table` SET `tableB`.`name` = ‘gdt‘ WHERE `table`.`index` =?", index, function(err, result) { if (err) { console.log(err); } else { resolve(‘更新成功‘); } }) }) } async function update() {
let result = ‘‘; //篩選出在公屏發言出現的環球uid和其對應的index var getinfoResult = await getInfo(); for (let i = 0; i < getinfoResult.length; i++) { var updateResult = await updateName(getinfoResult[i]); console.log(updateResult); }
return result?result:‘success‘; } update().then(function(result) { console.log(result); //斷開資料庫連接 connection.end(); //回到首頁 res.redirect(‘/‘); })}
這個問題我查閱了好多資料,問了好多人都沒有得到解決,後來改用了easymysql模組就解決了,非同步流程式控制制結束後頁面重新導向到首頁,重新按下“更新”會執行更新操作,不會報錯!
上面的代碼並沒有改成easymysql的文法,關於easymysql的用法可以參閱 https://github.com/aleafs/easymysql,不過還是建議Node項目結合像MongoDB這樣的NoSQL資料庫,要不是公司業務要求我是不會使用mysql的,囧~
Node中使用mysql模組遇到的問題