博客 / 詳情

返回

egg.js 連接遠程 mysql 數據庫

作為一個正在學習後端知識的菜鳥,最初存儲數據的方式是通過 fs 模塊存到本地的 JSON 文件中的。後來覺得太 low 還是得用上 mysql。

服務器 mysql 安裝

我是在騰訊雲的寶塔面板界面化安裝的,本地安裝可以去這裏下載並安裝。安裝完成後,試了一些命令確定安裝成功。

# 查看 mysql 的狀態
$ systemctl status mysqld

# 啓動 mysql
$ systemctl start mysqld

# 使用 root 權限登錄 mysql
$ mysql -u root -p

題外話,突然想起來無論是 nginx 還是 mysql 的啓動和查看狀態都是用的 systemctl 命令。

$ systemctl start nginx
$ systemctl status nginx

mysql 連接

我的 node 項目用到的是 egg.js。文檔非常友好,很細緻的説明了如何連接數據庫,詳見MySQL - Egg。

安裝依賴庫

$ npm i --save egg-mysql

開啓插件

// config/plugin.js
exports.mysql = {
  enable: true,
  package: 'egg-mysql',
};

配置數據庫信息

// config/config.${env}.js
exports.mysql = {
  // 單數據庫信息配置
  client: {
    // host
    host: 'mysql.com',
    // 端口號
    port: '3306',
    // 用户名
    user: 'test_user',
    // 密碼
    password: 'test_password',
    // 數據庫名
    database: 'test',
  },
  // 是否加載到 app 上,默認開啓
  app: true,
  // 是否加載到 agent 上,默認關閉
  agent: false,
};

遇到的問題

無法訪問遠程服務器

發現是我的騰訊雲服務器的 3306 端口未開放,打開之後就好了。

找不到 ip 地址

我在配置 host 的時候多加了 http:// 前綴,導致報錯。查了資料後才知道只要 IP 號或者域名即可。

    host: '101.33.37.187',

用户名寫錯

一開始用了 yang@localhost 這個用户名,後來發現 @localhost 後綴並不需要。

寫一個 service 驗證

const Service = require("egg").Service;

class DoneService extends Service {
  async findAll() {
    // 假如 我們拿到用户 id 從數據庫獲取用户詳細信息
    const user = await this.app.mysql.query("SELECT * FROM `done-tasks` WHERE 1", "");
    return { user };
  }
}

module.exports = DoneService;

最後

終於在不斷地嘗試後,連接上了遠程數據庫,開始了數據冒險之旅。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.