1. 程式人生 > >egg.js連線mysql資料庫遇到的坑

egg.js連線mysql資料庫遇到的坑

最近在策劃寫一個部落格採用前後端分離模式,前端使用vue後端使用egg.js,我也是剛開始學習egg.js,所以會將自己踩的坑都記錄下來.

首先介紹下後端為什麼採用egg.js吧,之前我是學習了koa2的,大部分基礎知識基本都學完了,後來看了下egg.js最終選用了他,其實egg.js也是基於koa開發的,但是egg.js號稱為企業級框架而生,所以我想嘗試下,其實最大的原因不是這個,主要由於egg.js比較規範化奉行約定優於配置的原則,與egg.js媲美的還有一款sails框架!話不多說!
首先需要安裝egg-mysql
$ npm i --save egg-mysql
然後開啟外掛
在config/plugin.js裡面加入以下程式碼
exports.mysql = {
  enable: true,
  package: 'egg-mysql',
};

其次就是連線mysql資料庫了,連線資料庫的基礎要點就是你電腦上安裝了mysql資料庫哇,不要說資料庫都沒安裝你就去連線,或者你有線上的資料庫連線也是可以的.egg-mysql外掛官方文件這樣寫的(我們因為是部落格所以用的是單資料來源),單資料來源配置如下:

// config/config.${env}.js
exports.mysql = {
  // 單資料庫資訊配置
  client: {
    // host
    host: 'mysql.com',
    // 埠號
    port: '3306',
    // 使用者名稱
    user: 'test_user',
    // 密碼
    password: 'test_password',
    // 資料庫名
    database: 'blog',
  },
  // 是否載入到 app 上,預設開啟
  app: true,
  // 是否載入到 agent 上,預設關閉
  agent: false,
};
個人建議直接配置在config.default.js裡面
module.exports = appInfo => {
  const config = exports = {};
    config.mysql = {
    client: {
      host: 'localhost',
      port: '3306',
      user: 'test_user',
      password: 'test_password',
      database: 'blog'
    },
    app: true,
    agent: false
  };
}
然後測試下是否連線成功,在一個service裡面用一段程式碼
    const user = await this.app.mysql.query('select * from user_list','');
官方文件這樣的
await app.mysql.query(sql, values);

官網的寫法是在有

const {app}=this;
1.在連線資料庫的時候還遇到一個坑,在以上所有都對的情況下還在控制檯報如下的錯誤
Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
這個主要是mysql安裝的時候有個叫強密碼模式導致這種錯誤的
![圖片描述][1]

點到下面按鈕選擇Use Legacy Password Encryption,或者在安裝的時候選擇這個選項
2.查詢資料庫返回結果會出現RowDataPacket導致這樣的資料結構取不到資料,
類似以下
[ RowDataPacket { user_name: 'wzj', password: '123456' },
  RowDataPacket { user_name: 'hyn', password: '123456' } ]
我們該如何處理以下的情況呢,其實很簡單JSON.stringify()把物件轉為物件字串就可以了!

目前就這麼多,如果道友你遇到啥奇葩的問題,在下方評論,我們共同摸索然後補到後續,讓更多的人更快的開發!