筆記 - 後端專案初期設置

有鑒於上次做專案都沒紀錄,這次將專案初始建置的哩哩摳摳記錄一下,不要每次都要從一片空白開始(就會不想開始 = =

Project initiation

mkdir folder

npm init -y

npm i express

npm i eslint

npm init @eslint/config

在 .eslintrc.js 中設定規則,參考

1
2
"rules": {
"semi": ["error", "never"]

新增檔案 .eslintignore 加入/node_modules/*

在 package.js 設定主程式以及常用腳本

1
2
3
4
5
6
"main": "app.js"
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js",
"lint" : "eslint \"**/*.js\" --fix"
}

npm i dotenv, 新增檔案 .env & .env.example

設定主程式 app.js 並啟動

  • 建構 express 應用程式伺服器
  • 設定路由
  • 設定 port
  • 啟動並監聽伺服器
    1
    2
    3
    4
    5
    6
    7
    8
    // @app.js
    require('dotenv').config()
    const express = require('express')
    const app = express()
    const port = process.env.PORT || 3000
    app.listen(port, () => {
    console.info(`App is listening to port ${port}`)
    })

設定首頁路由 routers/index.js

1
2
3
4
5
6
7
8
9
10
11
// app.js
const routes = require('./routes')
app.use(routes)

// routes/index.js
const express = require('express')
const router = express.Router()
router.get('/', (req, res) => {
res.send('Hello World!')
})
module.exports = router

啟動 server 並開啟 localhost:3000 確認


git 版本設定

git init 並新增 .gitignore, .gitattributes

.gitignore 記得加 .vscode/
不小心忘記想要刪除 git 追蹤方法

確認沒問題就 commit “project initiation”
commit convention 參考


Database connection - MySQL

MySQL 建立專案資料庫

在 MySQL workbench 中新增資料庫

1
2
3
drop database if exists db_name;
create database db_name;
use db_name;

Express 設定資料庫連線

安裝 mysql2、sequelize 與 sequelize-cli

1
npm install mysql2 sequelize sequelize-cli

mysql2 是讓 Node.js 能使用 MySQL 的套件 (package)。安裝之後我們就能在 Node.js application 裡使用 SQL 指令,操作 SQL 資料庫。

初始化 Sequelize 並設定資料庫的名字與密碼

1
npx sequelize init
  • config/config.json:資料庫設定檔,已經自動帶入內容,development 段落帶入 mysql password 以及要連線的資料庫名稱 db_name
  • models/index.js:model 的設定檔,eslint 刪掉 semi colon 就好
  • migrations:資料庫設定檔的存放位置(空資料夾)
  • seeders:種子資料設定檔的存放位置(空資料夾)

建立 model

1
npx sequelize model:generate --name model_name --attributes att1:string,att2:boolean

model_name 通常字首大寫,單數

注意 attributes 之間不能有空格(實作有發現跑完指令後有少屬性,不知道是不是不能太長)

執行後會在 migrations 與 models 中各產生一個檔案

  • migration 檔案確定參數都在
  • model 檔案 (1) Model_name.init 後面寫 allowNull, defaultValue 等設定 (2) 下面 要寫 tableName (複數)
1
2
3
sequelize,
modelName: 'User',
tableName: 'Users' // 此行要自己寫

好了就跑 npx sequelize db:migrate 並到 MySQL workbench 查看資料庫狀態 select * from tableName


設定關聯

在 table 中新增放 foreign key 的欄位

npx sequelize migration:generate --name add-userId-to-record

產生 migration 檔案後,寫入 queryInterface 指令,references 描述關聯

npx sequelize db:migrate 後,至 MySQL workbench 確認 table 有新增欄位

設定 model 關聯

Association 官網說明

目前專案關聯關係為

  • User has many Records
    1
    2
    // @model/users.js
    User.hasMany(models.Record, { foreignKey: 'UserId' })
  • Record belongs to a user
    1
    2
    // @model/records.js
    Record.belongsTo(models.User)

試新增資料

1
2
3
// app.js
app.use(express.urlencoded({ extended: true }))
app.use(express.json())

引入 model, model.create 新增資料,

1
2
3
4
5
6
7
const db = require('model 路徑')
const User = db.User
router.post('/test', (req, res) => {
const { 參數們 } = req.body
User.create({ 參數們 })
.then(res.status(200).json({ status: 'ok' }))
})

用 postman 打打看是否能正常寫入資料庫,ok的話就可以下一步: create seeder

Migration 用法

建立 model
npx sequelize model:generate --name model_name --attributes att1:string,att2:boolean

執行 migration 中 up 指令
npx sequelize db:migrate

還原指令 (執行 down 指令還原上一個版本)
npx sequelize db:migrate:undo

查看目前狀態
npx sequelize db:migrate:status

還原至特定版本
npx sequelize db:migrate:undo:all --to XXXXXXXXXXXXXX-create-todo.js

還原至初始狀態
npx sequelize db:migrate:undo:all

新增 migration 檔案
npx sequelize migration:generate --name (說明 migration 目的)

在檔名上盡量把 model 和欄位的名稱帶進去,再選用一個適當的動詞,如 add

官網說明 | queryInterface 指令