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的,囧~