Backend[0]

By 小黑

目錄

- 迷你版網路概論

- JavaScript 複習

- Node.js & npm

- Express.js

- Routing

講師介紹

小黑(吳習之)

- 建中電研 44th 網管

- 寒訓一小隊輔 & 暑訓三小隊輔

- Linux & Python 廚

- 不要像我一樣選二,然後被炸魚

迷你版網路概論

打個比方啊:菜市場

- 你今天家裡比如說有四口人六口人也好,總會上菜市場

- 你看到一家之前在天龍國去過的店,好奇走了進去

- 你問老闆之前有的老婆餅有賣嗎,老闆說沒有

- 你又問老闆有賣牛舌餅嗎,老闆說有

- 於是你跟老闆訂了一盒,老闆也給你了

這跟網頁有啥關係?

Request & Response

還是你

網站伺服器

/about 有網頁嗎

老闆

有太陽餅嗎

沒有欸

404 Not Found

Request & Response

還是你

網站伺服器

/home 有網頁嗎

老闆

有牛舌餅嗎

有哦

Request & Response

還是你

網站伺服器

請根據 Prompt 回答 

老闆

那給我來一盒(給錢)

(給牛舌餅)

(給回覆)

Request

- 跟老闆講你要幹嘛 = 跟伺服器要網頁
- Request 有不同方法 -> 你跟老闆問的不同問題

GET = 你想得到知道有沒有賣 XX = 讀取網頁

POST = 拿錢跟老闆換牛舌餅 = 給伺服器資料要東西

DELETE = 取消訂單 = 跟伺服器講你要刪資料

Response

- 老闆的回應 = 伺服器給你的 Response

- Response 的 head = 牛舌餅的資訊(哪牌的、價格)

- Response 的 body = 牛舌餅本身 = 網頁 or 資料

- Response 的 status code = 老闆給你的不同答案

200 = 一切順利

201 = 你訂單下了且老闆也在處理了

400 = 老闆看不懂你的訂單

404 = 這裡沒賣

500 = 老闆店裡出了點 trouble

JavaScript 複習

Hello World!

console.log("Hello, world");

Variable

let name = "Aaron"; // String
console.log(name); // "Aaron"

let age = 16; // number
age = 18;
console.log(age) // 18;
let eth_price = 1496.98; // number, but QAQ

const avogadro = 6 * Math.pow(10, 23);

Function

let add = (a, b) => {
  return a + b;
}; // arrow function

function add(a, b) {
  return a + b;
}

Node.js & npm

Node.js

- JavaScript 理論上只能跑在 Browser,對吧?

- But 有人嫌傳統的 Server 設計很卡,沒辦法同步處理請求

- 所以拿 V8 替 JavaScript 寫了一套類似 Interpreter 的東東

- 這東東就叫 Node.js

- Node.js 讓你可以在電腦上跑 JS

- 然後就有人拿 JS 來寫後端了 (怒

npm (Package Manager)

- 如題,是個 package manager

- 假設你想寫遊戲,但沒有現成的 Library

- 沒有 npm,你得自己去找 Library 自己裝

- 有 npm 的話,你可以方便的透過幾條指令安裝 Library

Express.js

Express.js

- 一套很老的後端框架

- JavaScript 寫後端的第一選擇

安裝

1. 開一個新的資料夾,名稱隨意

2. cd 到這個資料夾

3. 初始化 npm

4. 用 npm 安裝 Express

mkdir hello_express
cd hello_express
npm init -y
npm i express

Hello, Express!

Express,啟動!

- 在剛剛的資料夾底下創個 JS 檔 server.js,手敲下面的 code

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World!')
})

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

- 敲完之後存檔,然後在剛剛的資料夾底下跑以下指令

node server.js

- 在瀏覽器打 localhost:3000 ,理論上就看得到網站了

Routing

Routing

- 一種定義使用者(瀏覽器)進入特定 URL 時,伺服器該返回哪些內容或執行哪些操作的機制

app.get('/', (req, res) => {
  // 要執行的內容
});

Callback Function

(要執行的操作)

URL

Method

URL - Params (參數)

app.get('/:user/:article_id', (req, res) => {
  let user = req.params.user;
  let article_id = req.params.article_id;
  
  res.send(`${user} ${article_id}`);
});

URL - Query String

- URL 裡 ? 開頭的那段就是 Query String

- ? 後面每個 XX=XX 的鍵值對用 & 分隔

app.get('/', (req, res) => {
  let title = req.query.title;
  let action = req.query.action;
  
  res.send(`${title} ${action}`);
});

Router

const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
  res.send('This is the home page');
});

router.get('/about', (req, res) => {
  res.send('About us');
});

const app = express();
app.use('/api', router);

app.listen(3000);

EJS

EJS

- EJS 是一個 JavaScript 的 Template Engine

- Template Engine 的功能是根據模板生成 HTML 

- 安裝:

npm i ejs

- 接著在剛剛創的資料夾底下創 views

- EJS 的寫法就很像 HTML ,只是加了 JS 的一些語法

- 等下創的 EJS 模板都會放這

第一個 EJS 程式

- 在 views 資料夾底下創 index.ejs ,內容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Hello</h1> 
</body>
</html>

- 基本就跟 HTML 沒啥兩樣

第一個 EJS 程式

- 接著稍微修改一下 server.js

const express = require('express');
const app = express();
const port = 3000;

// 設置 EJS 為模板引擎
app.set('view engine', 'ejs');
// 設置視圖文件夾(可選,預設是 'views')
app.set('views', './views');

app.get('/', (req, res) => {
    res.render('index');
});

app.get('/search', (req, res) => {
    let title = req.query.title;
    let action = req.query.action;

    res.send(`${title} ${action}`);
});

app.listen(port);

解釋

- Express 會去 views 抓 ejx 檔,並渲染

- 到 localhost:3000 就會看到網頁了

加圖片跟 CSS

- Express 可以創一個專門放 CSS、圖片等東西的資料夾

- 一樣在 server.js 裡加(加在 app.get 那幾行前)下面的 code

- 接下來就在模板檔案裡正常加圖片、CSS 那些

// 設置靜態文件目錄
app.use(express.static('public'));

- 圖片跟 CSS 要丟在 public 資料夾裡

在 EJS 裡執行 JS

- <%- %> 可以渲染 HTML 標籤

- <% %> 執行一行 JS 但不返回執行結果

- <%= %> 執行一行 JS 且返回執行結果

Backend[0]: Express

By Aaron Wu

Backend[0]: Express

  • 120