作為一個正在學習後端知識的菜鳥,最初存儲數據的方式是通過 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;
最後
終於在不斷地嘗試後,連接上了遠程數據庫,開始了數據冒險之旅。