弱弱的碰一下後端 —— 未完待續


Posted by Lindsay0214 on 2021-08-10

本週重點

  • Express 是可以在 Node.js 環境下執行的輕量後端框架,自由度極高,也能夠快速開發出後端應用程式。
  • 試試看能不能快速上手 Express 並完成作業。
  • ORM(Object Relational Mapping)-> Sequelize
    簡單來說就是把一個程式碼裡面的物件跟資料庫的物件做映射(mapping),優點就是當你操作程式裡的物件時,就會改到資料庫裡的資料。
  • 部署到 Heroku或是自己的主機(nginx + PM2)。

Node.js 實作一個 Server

( 底層透過 http.createServer 建立 Server )

  1. index.js
const http = require('http')               // node.js 內建 http 相關的 module
const server = http.createServer(handler)  // http.createServer(function)

function handler(req, res){      // node.js 會給兩個參數 req、res
    console.log(req.url)
    res.write('hello!')
    res.end()                     // 把 res 丟回去(結束)
}

server.listen(5001)               // 最常 80 part
  1. 終端機上執行 node index.js
  2. 瀏覽器網址打開 localhost:5001
  3. 終端機上跑出 /favicon.ico 就是網頁標題旁邊的那個小 logo
    標準點的寫法會加上:
res.writeHead(200, {
    'Content-Type': 'text/html'   // 瀏覽器就知道你想要解析的格式,但有些瀏覽器很聰明會自己幫我們解析
})

在 node 中增加靜態檔案 & 路徑讀取

expressjs__static
Node.js 中的 __dirname__filename

const absolutePath = path.join(__dirname, '../lib/common.js')
or
app.use('/static', express.static(__dirname + '/public'));

Express

expressjs

  1. 新增一個資料夾
  2. terminal npm init
  3. npm install express
  4. index.js
const express = require('express')
const app = express()
const port = 5001

app.get('/', (req, res) => {
    res.send('hello')
})

app.listen(port, () => {
    console.log(`Example app listening on port ${port}!`)
})

然後 terminal run -> node index.js -> localhost:5001 就會出現 Hello 了

補充

用 Express 製作簡易的留言版
Introduction · Node.js 從無到有,打造一個漂亮乾淨俐落的 RESTful API (gitbooks.io) 試起來!

跟 LAMP 差別

Apache + PHP Process

瀏覽器 -> Apache Sercer -> PHP
瀏覽器 <- Apache Sercer <- PHP

Express Process

瀏覽器 -> Express Server
瀏覽器 <- Express Server

What is MVC?

之前快速筆記過關於 MVC 的定義

  • Model:模型,負責處理資料、演算法、商業邏輯等等。
  • View:視圖:欲呈現的畫面。
  • Controller:控制器,控制、處理使用者的請求(request)。
    Controller 跟 Model 拿 data -> 拿完 Controller 把 data 塞去 View,就變完整的 response 了(template+data)-> 回傳回去

ejs

terminal npm install ejs

Middleware

app.use((req, res, next) => {
    next()
})

bodyParser

拿 request body 裡面的資料
body parsing middleware

npm install body-parser
const bodyParser = require('body-parser')

app.use(bodyParse.urlencoded({ extend: false }))
app.use(bodyParser.json())

Express session

npm install express-session
session middleware
做登入登出功能

app.use(session({
    secret: 'keynoard cat',
    resave: false,
    saveUninitalized: true

app.use(function (req, res, next){
    if(!req.session.views){
        req.session.views = {}
    }
  })
}))

connect-flash

connect-flash middleware
通知訊息

res.locals

重複物件自己做一個 middleware 變全域,res.locals view 都可以拿到

index.js

app.use((req, res, next) => { // 自己做 middleware,就不用一直寫重複物件
    res.locals.isLogin = req.session.isLogin || false
    res.locals.errorMessage = req.flash('errorMessage')
    next()
})

做 hash

node.bcrypt.js

npm install bcrypt

ORM Object Relational Mapping

本來在操作資料庫裡的東西 (SQL query) 把他看成物件(Object),
所以用操縱 Object 的方式來操作資料

Sequelize
方法文件裡寫的蠻清楚,多多熟悉就好!

npm install --save sequelize
npm install --save mysql2
npm install --save sequelize-cli
npx sequelize-cli init
npx 可以用 ./node_modules/.bin/sequelize 指令代替(npx 就是這個位置,但有時
後跑比較慢)

./node_modules/.bin/sequelize model:generate --name User --attributes username:string,password:string,nickname:string

./node_modules/.bin/sequelize model:generate --name Comment --attributes content:text

./node_modules/.bin/sequelize db:migrate

./node_modules/.bin/sequelize db:migrate:undo

Sequelize 裡的資料庫關聯
.hasOne
.hasMany

ex.
User.hasMany(Comment)    -> 單向關聯到 Comment
Comment.belongsTo(User)  -> 建立雙向關係

Heroku

Heroku
其他類似平台:Google GAE、新浪云 SAE 不過在這之前都沒聽過,只聽過 Heroku

  • 環境變數

Proxy Server

  • 代理伺服器:把 client 真實身份藏起來
  • Reverse Proxy 反向代理
    • 當網站入口 -> 80port 上放就可以連到不同 server
    • Nginx 就是 Reverse Proxy Server

##程式導師計劃 MR05 ##不適合新手的新手筆記 ##Nodejs ##Express







Related Posts

原子習慣

原子習慣

Day07 MMD (MikuMikuDance)

Day07 MMD (MikuMikuDance)

Longest Common Prefix

Longest Common Prefix


Comments