BACK
Featured image of post Node.js + Express + MySQL 搭建項目框架

Node.js + Express + MySQL 搭建項目框架

MySQL過去是一個開放程式碼的關聯式資料庫管理系統,由於效能高、低成本且穩定性高,廣泛被使用在網頁系統上,例如:維基百科、google、Facebook等,目前為Oracle旗下產品,分為免費的社群版、付費的標準版與商業版,可以透過MySQL Workbench作為資料庫管理工具。

參考網站
參考網站

本文主要是展示使用 ExpressMySQL 來搭建項目框架的步驟,展示瞭如何搭建項目並進行基本操作。


創建項目

Express 是基於 Node.js 平台,快速、開放、極簡的 Web 開發框架。

全局安裝 express-generator

express-generator 是 Express 應用程序生成器工具,我們可以使用它來快速創建應用程序框架。

1
2
3
4
npm install -g express-generator

# (expressFrame 是項目名)
express expressFrame

項目的目錄結構

  • bin/www 是啟動入口文件,在裡面可以設置端口號等

下載依賴

創建好項目之後,裡面有包含基本的項目文件,也有相關依賴

1
npm install

啟動項目

1
2
3
4
npm start

# 啟動命令還可以是:
# node ./bin/www

安裝 nodemon

可以安裝 nodemon 來監控 node.js 源代碼的任何變化和自動重啟你的服務器

全局安裝 nodemon

1
npm install -g nodemon

啟動項目

1
nodemon bin/www

這就啟動成功啦

瀏覽器打開http://localhost:3000就能看到頁面啦


安裝 winston 添加打印日誌文件

這裡採用的是 winston 日誌

具體用法可看文檔:https://www.npmjs.com/package/winston

1
npm i winston

配置打印日誌格式

在項目的根目錄添加一個配置打印日誌格式的文件 logger.js (此文件在 github 上)

修改 app.js 的配置

修改項目默認的變量名:

  1. const logger = require('morgan'); 改成:const morgan = require('morgan')
  2. 相應的也要把 app.use(logger('dev')); 改成:app.use(morgan('dev'));
1
2
3
4
5
6
7
// ...
- const logger = require('morgan');
+ const morgan = require('morgan');

- app.use(logger('dev'));
+ app.use(morgan('dev'));
// ...

引入 logger.js 文件

1
const logger = require('./logger')

修改錯誤處理

將錯誤打印到日誌上

測試日誌是否打印成功

請求一個不存在的路由,如:http://localhost:3000/hello

打開日誌文件,看到這條錯誤被打印出來就成功啦


MySQL

啟動數據庫

這裡使用的方法是用 Docker 安裝 MySQL

這裡是安裝的教程:https://www.runoob.com/docker/docker-install-mysql.html

  1. docker 拉取 MySQL 鏡像
1
docker pull mysql:latest
  1. 查看本地鏡像
1
docker images
  1. 運行容器
1
2
# docker run -itd --name {容器名} -p 3306:3306 -e MYSQL_ROOT_PASSWORD={MySQL root 密碼} mysql
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

參數說明:

  • -p 3306:3306:映射容器服務的3306端口到宿主機的3306端口,外部主機可以直接透過 宿主機ip:3306 訪問到 MySQL 的服務。
  • MYSQL_ROOT_PASSWORD=123456:設置 MySQL 服務 root 用戶的密碼。
  1. 安裝成功

透過 docker ps 命令查看是否安裝成功
本機可以通過 root / 123456 訪問 MySQL 服務。

安裝數據庫管理工具

這裡選擇用 Sequel Pro 啟動好數據之後,就在 Sequel Pro 連接數據庫,密碼是啟動數據庫時自己設置的密碼

使用 Navicat 數據庫管理工具連線時,出現錯誤

若出現 1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client 錯誤,原因為:
mysql8 之前的版本,加密規則是 mysql_native_password,而 mysql8 之後的版本,加密規則是 caching_sha2_password

解決方法:

  1. 升級 navicat 驅動。
  2. 進到容器內,把 mysql 用戶登入密碼加密規則還原成 mysql_native_password

以下採用方法2解決,操作如下:

1. 打開 cmd,輸入以下指令以 bash 進入容器:

1
2
# docker exec -it {容器名} bash
docker exec -it mysql-test bash

2. 使用 mysql 指令連線資料庫:

1
mysql -u root -p

3. 使用 mysql 指令查詢用戶訊息:

1
select host, user, plugin, authentication_string from mysql.user;

host% 表示不限制 ip、localhost 表示本機使用
pluginmysql_native_password需要修改密碼

4. 使用 mysql 指令修改密碼:

  • 更新 user 為 root, host% 的密碼為 123456
1
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  • 更新 user 為 root, hostlocalhost 的密碼為 123456
1
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

5. 再次在 Navicat 中連接 mysql,連接成功

創建數據庫

使用數據庫管理工具新建數據庫 database 名稱為:expressFrame

進入 expressFrame 庫,新建用戶信息表為 user ,默認有 id 字段,需要再添加以下必要字段:

字段:id

1
2
Field:name Type:VARCHAR LENGTH:255 Comment:姓名
Field:phone Type:VARCHAR LENGTH:255 Comment:手機號

使用 Knex.js 增刪改查數據庫

Knex.js 是為 PostgresMSSQLMySQLMariaDBSQLite3OracleAmazon Redshift 設計的 SQL 查詢構建器,其設計靈活,便於攜帶並且使用起來非常有趣。Knex 的主要目標環境是 Node.js,您需要安裝該 knex 庫,然後安裝適當的數據庫庫:pg 適用於 PostgreSQLCockroachDBAmazon Redshiftpg-native 對於具有本機 C++ libpq 綁定的 PostgreSQL(需要安裝 PostgresSQL 才能鏈接),mysql 適用於 MySQLMariaDBsqlite3 適用於 SQLite3tedious 適用於 MSSQL

FlagLibrary
pgPostgreSQLCockroachDBAmazon Redshift
pg-native本機 C++ libpq 綁定的 PostgreSQL(需要安裝 PostgresSQL 才能鏈接)
mysqlMySQLMariaDB
sqlite3SQLite3
tediousMSSQL

下載相關依賴

1
npm install -save knex mysql

添加配置信息

在項目根目錄下,新建配置信息 config.js,之後的配置信息涉及到數據庫和密碼,不上傳到 Github 等託管平台,所以需要單獨設置,使用 .gitignore 避免上傳。之後敏感的配置信息,都將在此配置。host 地址為數據庫的服務地址,本地為 127.0.0.1

config.js
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
const configs = {
  mysql: {
    host: '127.0.0.1',
    port: '3306',
    user: 'root',
    password: '123456',  // 自己設置的密碼
    database: 'expressFrame' // 數據庫的名字
  },
  // 打印错误
  log: {
    error (message) {
      console.log('[knex error]', message)
    }
  }
}

module.exports = configs

新建 .gitignore

在項目根目錄下,新建 .gitignore 避免上傳 config.jslognode_modules 等不需要被上傳到 Github 的文件。

.gitignore
1
2
3
4
5
6
7
.DS_Store
.idea
npm-debug.log
yarn-error.log
node_modules
log
config.js

數據庫配置

新建 models/knex.js,初始化配置 knex

models/knex.js
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// 引用配置文件
const configs = require('../config');
// 把配置文件中的信息,設置在初始化配置中
module.exports = require('knex')({
  client: 'mysql',
  connection: {
    host: configs.mysql.host,
    port: configs.mysql.port,
    user: configs.mysql.user,
    password: configs.mysql.password,
    database: configs.mysql.database
  },
  // 打印錯誤
  log: {
    error (message) {
      console.log('[knex error]', message)
    }
  }
})

knex 增刪改查

models 下新建文件 base.js

models/base.js
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const knex = require('../models/knex');

class Base{
  constructor(props){
    this.table = props;
  }

  // 查找
  all (){
    return knex(this.table).select();
  }

  // 新增
  insert (params){
    return knex(this.table).insert(params);
  }

  // 更改
  update (id, params){
    return knex(this.table).where('id', '=', id).update(params);
  }

  // 删除
  delete (id){
    return knex(this.table).where('id', '=', id).del();
  }

}

module.exports = Base;

新建用戶模型

models 下新建文件 user.js

models/user.js
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
const Base = require('./base');

class User extends Base {
  // 定義參數默認值為 user 表
  constructor(props = 'user'){
    super(props);
  }
}

module.exports = new User();

新建用戶控制器

在根目錄新建控制器文件夾 controllers,在 controllers 新建 user.js,並設置 showUser 方法

controllers/user.js
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// 引用用户模版数据
const User = require('../models/user.js');

const userController = {
  // showUser 獲取用戶數據並返回到頁面
  showUser: async function(req,res,next){
    try{
      let userData = await User.all()
      res.json({
        code: 200,
        message: "操作成功",
        data: userData
      })
    }catch(e){
      res.json({ code: 0, message: "操作失敗", data: e })
    }
  },
}

module.exports = userController;

添加獲取用戶接口

修改路由 routes/index.js,添加獲取用戶信息的接口

routes/index.js
1
2
3
4
const userController = require('../controllers/user');

// 獲取用戶信息
router.get('/get_user', userController.showUser);

測試接口

訪問一下 http://localhost:3000/get_user

查看接口返回的數據

這就大功告成啦~

github地址:https://github.com/wjdesign/nodejsExpressMysqlDemo

走過路過點個贊唄~


comments powered by Disqus