iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 16
2
Modern Web

還在想要買哪一堂線上課程嗎?培養看文件的習慣吧!用 MDN 文件學後端:NodeJS & MongooseDB系列 第 16

16日: Express/Node introduction ( Node 介紹 、 Hello Node.js 、 Express 介紹 )

出處 , 有繁體版 ( 僅上半部分 ) 進入後自行點選

寫在前面

大概滑了一下這頁 , 非~常~的長 , 希望不要寫三天啊~但我覺得會超過

Node 介紹

Node 是一個開源 、 跨平台 、 開發者可以用 JS 開發 ss app 和工具的執行環境 。 目的是可以在瀏覽器外直接執行 ( 也就是說可直接在電腦運行或在伺服器上運行 ) , 因此這個環境會忽略瀏覽器限定的 JS APIs , 並支援傳統的 OS ( operating system ) APIs , 包含 HTTP & file system libraries

從 web server 開發觀點來看 , Node 有很多優勢 :

  • 超棒~的表現 ! Node 是被設計用來優化傳輸量 & 可過展性的 web app , 而且也是解決諸多網站開發問題很好的方式 ( 例如 real-time web app , 我去估狗了一下這究竟是什麼 , 發現用 Socket.io 可以實踐 , 有興趣的人可以下這個關鍵字 , 或是點下方連結來看它可以做到什麼有趣的事 (圖文並茂又親民的文章) :
    [Day 12]-說好的物聯網呢?很重要一定要看!用 Socket.io 建立即時連線~實作篇 - 鐵人賽不同團的戰友 King Tzeng )
  • 由樸實又古典的 JS 寫成 , 這表示可以花更少時間去處理 cs & ss 之間的 語種轉換
    ( 前後端語言一致 ; 因傳統後端語言可能會是 Python, PHP ... 等等 )
  • 跟傳統的 web-server 語言相比 , JS 是相對新的語言 , 有更進步的語言設計 。
    許多其他又新又潮的語言能轉譯成 JS , 所以我們可以用 TypeScript, CoffeeScript, ClojureScript, Scala, LiveScript ... 等等
  • Node package manager ( NPM ) , 成千上萬的套件可供使用 , 它是同類中最好的相依( dependency )解方 , 並可自動化多數工具鍊
  • Node 有可攜式特性 , 它可以在 Windows, macOS, Linux, Solaris, FreeBSD, OpenBSD, WebOS, NonStop OS上執行。
    對多數主機商提供的主機有很好的支援度 , 主機商通常會在 Node sites 的主機附上特定設置及相關文件
  • 第三方活躍的生態系統 & 開發社群 & 一大票熱心伸出援手的開發者們

我們可以用 Node HTTP package 打造一個簡易的 web server

Hello Node.js

終於要Hello了!
下方範例是建立一個偵聽 http://127.0.0.1:8000/HTTP req web server ,
當 server 接到 req , 腳本碼運行 , 回覆要執行回傳字串 Hello World 的 res , 如果已經安裝好 Node , 我們接著以下步驟 :

  1. 打開終端機 Terminal ( 我習慣都直接在 vs code 專案資料夾打開 terminal , 可以省略第二步驟 )
  2. 新增專案資料夾 ( 例如 test-node ) , 然後進入資料夾:
新增 & 進入指令 ( 以後若要操作遠端主機就沒有右鍵或圖形介面 ( GUI ) 可以新增資料夾 )
mkdir test-node
cd test-node

進入資料夾也可以把資料夾拖到終端機介面 , 路徑就會自動生成 , 然後再到最前面補上cd , 例如:

拖進來之後長這樣
[~/Document/其他任意當前位置] $ /Users/使用者名字/Documents/鐵人賽2020/test-node
補上指令
[~/Document/其他任意當前位置] $ cd /Users/使用者名字/Documents/鐵人賽2020/test-node
這樣就會進入資料夾了
[~/Documents/鐵人賽2020/test-node] $
  1. 用慣用的文字編輯器 ( 如 vs code ) , 新增一個 hello.js , 貼上這段 code 之後儲存 ( 這部分與繁中版有些許不一樣 , 主要差異在於這邊用到 ES6 ) :
// 載入 HTTP 模組
const http = require("http");

const hostname = "127.0.0.1";
const port = 8000;

// 建造 HTTP server 
const server = http.createServer((req, res) => {

   // 設定 response HTTP header 並帶上 HTTP status and Content type
   res.writeHead(200, {'Content-Type': 'text/plain'});
   
   // 傳送 response body "Hello World"
   res.end('Hello World\n');
});

// 當 server 開始偵聽 , terminal 印出這段 log
server.listen(port, hostname, () => {
   console.log(`Server running at http://${hostname}:${port}/`);
})
  1. 回到終端機輸入 :
node hello.js
  1. 開啟瀏覽器 , 連到 http://localhost:8000 , 會看到 Hello World 在頁面中出現

框架

其他常見的框架任務都不受 Node 直接支援 ,
如果想要為 HTTP 行為 ( GET, POST, DELETE ... ) 新增特定處理器 , 需在不同 URL paths ( routes ) 個別處理 req , 或用 templates 新增 res , 但需要全部自己寫 。
要避免重複造輪 , 就用框架吧 !

Express 介紹

Node 最紅的框架 , 而且是眾多流行 Node 框架的基層函式庫 ( 啊 ? 表示他很輕量可兼具 framework & library 吧 ) , 它有以下機制 :

  • 可以用不同 URL paths ( routes ) 處理不同 HTTP 行為 , 寫不同的處理器
  • 整合 view 渲染引擎 , 目的是在 template 中插入資料 , 產出 res
  • 常用的 web app 設定 , 像是連接 port & 用來渲染 res 的 local templates
  • 在任何的 req 處理管道時機點 , 加入額外的 req 處理 -- middleware

middleware 補充 :

因 Express 本身比較輕簡 , 開發者為了解決大部分的網頁開發問題 , 已建造兼容的 middleware 套件 。
有很多程式庫可以和 cookies, sessions, user logins, URL parameters, POST data, security headers, ... 等等進行協作 。 可以在 Express Middleware 找到 middleware 現正流行的第三方套件清單

Note: 這樣高彈性是把雙面刃 , 由middleware 套件處理大部分碰到的問題 , 但選用正確的套件有時是種挑戰 。
沒有建構 app 絕對正確的方式 , 在網路上可以找到很多範例 , 但可能沒有優化過 , 或是僅有少部份是在開發 app 時所需要的


上一篇
15日: Express web framework (Node.js/JavaScript) ( 前言 )
下一篇
17日: Express/Node introduction ( Node & Express 從何而生 、 有多熱門 、 主導性 、 Importing and creating modules )
系列文
還在想要買哪一堂線上課程嗎?培養看文件的習慣吧!用 MDN 文件學後端:NodeJS & MongooseDB30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
阿展展展
iT邦好手 1 級 ‧ 2019-11-06 04:34:33

千呼萬算使出來
https://ithelp.ithome.com.tw/upload/images/20191106/20119546yYgcBuJzwV.jpg

PeterLiao iT邦新手 4 級 ‧ 2019-11-06 15:46:19 檢舉

謝謝你啊,好認真看了我這麼多篇/images/emoticon/emoticon07.gif

那當然!!! 大大的文章好精采的!!!

我要留言

立即登入留言