Node中使用mysql模塊遇到的問題


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

 


免責聲明!

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



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