---
# System prepended metadata

title: '[GDSC] NodeJS (3)'
tags: [GDSC]

---

# [GDSC] NodeJS (3)

[TOC]

> 我不是 Javascript 專業，講錯歡迎指教

---

## Express Prerequisite
> [!Note] Reference
> - [Express Docs](https://expressjs.com/)

### Installation

- 官方提供框架套件安裝指令 : 
    ```bash=
    npm install --save express
    ```
- [Express Generator](https://www.npmjs.com/package/express-generator) :
    ```bash=
    npm install -g express-generator
    ```
    ```bash=
    # Initialize
    express --view=[TEMPLATE_ENGINE] [Folder]
    # Install dependencies
    npm install
    # Start running at http://localhost:3000 (default)
    npm start
    ```
    
### Project Structure
```
- bin/www
    載入主程式以及 server, address, port 設定
- public/
    主要是一些 style sheets 以及 images 的 static resources
- routes/
    路由目錄
- views/
    放置 view file (according to template engine)
- app.js
    設置 view engine, middlewares, routes
- package.json
    主要是跑程式的 scripts 以及 npm install 的套件
```

---

## MVC Pattern

對應先前所述 : 
- Model
    可以對應到 mongoose 的 Schema
- View
    template engine (e.g., pug) 呈現的內容
- Controller
    大概就是那些 HTTP request method 處理的東西

<img src='https://miro.medium.com/v2/resize:fit:1100/format:webp/1*ShfLwhnTPQ6SIGckSGpAQw.png'>

### Online Resources
[MDN Tutorial - Express web framework (Node.js/JavaScript)](https://developer.mozilla.org/en-US/docs/Learn/Server-side/Express_Nodejs)

---

## API Protocol

<img src='https://media.licdn.com/dms/image/D4D12AQGf2tfmrTOkYA/article-inline_image-shrink_1500_2232/0/1707811800485?e=1727308800&v=beta&t=Gb7zHukHZsbX-zQS7fUplceDTl-M1vi0_O8TbnVMB5I'> 


### REST (Representational State Transfer)
    
>[!Tip] Features
> - 使用標準的 HTTP 協定
>   GET, POST, DELETE, PUT...
> - 基於 JSON
> - Stateless
    不由 Server-side 儲存狀態，由 Client-side 管理狀態，可使用 `localStorage`, `sessionStorage`, 或是 React 中的 `useState`

>[!Warning] Disadvantages
> - CRUD 不夠靈活

:question: What is **so-called REST** 

### GraphQL

>[!Tip] Features
> - 支援 [Query language](https://graphql.org/)
> - 靈活性高
>    可以根據需求索取需要的資料 (減少過多資料傳輸)

>[!Warning] Disadvantages
> - 學習曲線較高
> - 大型查詢會有性能隱憂


### gRPC (gRPC Remote Procedure Calls)

>[!Tip] Features
> - 使用 [ProtoBuf（Protocol Buffers）](https://protobuf.dev/)作為定義語言
>   副檔名以 `.proto` 結尾
> - HTTP/2
>   傳送 binary, TCP 多路覆用等特性
> - 適用於微服務 (microservices) 架構

>[!Note] More details
> GeeksforGeeks - [Difference between HTTP/2 and HTTP/1.1
](https://www.geeksforgeeks.org/difference-between-http-2-and-http-1-1/)

>[!Warning] Disadvantages
> - 流量控制與錯誤處理相對複雜

### WebSockets

>[!Tip] Features
> - Real-time
> - 全雙工，透過單一 TCP 連接實現
> - Continuous connection
> - 適用於在線遊戲, 即時聊天服務

>[!Warning] Disadvantages
> - 不支援 Stateless (資源消耗)
> - 網路代理與防火牆設定

### SOAP (Simple Object Access Protocol)

>[!Tip] Features
> - 基於 XML
> - 企業級應用，具有嚴格的 Transaction 以及 Security 規範
> - 主要使用 HTTP 作為傳輸協定 (HTTPS 需要使用 WS-Security)

>[!Warning] Disadvantages
> - 同時也相對的耗費資源
> - 伺服器需要儲存先前與客戶端交換的所有資訊來維護狀態

### Webhook

>[!Tip] Features
> - Event-driven, Asynchronous, HTTP Callback
> - 用於觸發自動化流程，像是 Workflow automation (CI/CD), Third-party services integrations (Github, Jenkins)

>[!Warning] Disadvantages
> - 安全性管理，包含偽造請求、數據洩漏
