前兩天都用Node.js原生的http模組手刻邏輯,今天正式安裝Express,實際比較用框架前後,同樣的功能程式碼量差多少,過程中也出現了一個複製貼上的坑。
今天做的事
安裝Express:
node install express
把路由改成Express的寫法:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('這是首頁');
});
app.get('/about', (req, res) => {
res.send('這是關於頁面');
});
app.get('/success', (req, res) => {
res.status(200).send('請求成功');
});
app.get('/notfound', (req, res) => {
res.status(404).send('找不到這個頁面');
});
app.listen(3000, () => {
console.log('伺服器啟動於 http://localhost:3000');
});
卡關:路由重複,Express不會提醒
一開始複製貼上路由後忘記把/success的路由修改,變成又寫了一次/about,結果瀏覽器打開/success的時候,出現Connot GET /success,原本以為是伺服器沒重啟,重開了好幾次都沒用,後來檢查程式碼的時候,才發現是我沒有改到/success的部分。
這件事讓我知道:Express不會提醒我路由重複,重複的路由只是不會被執行到,除錯時要回頭逐行檢查路徑名稱,不能只看有沒有紅字警告。
觀察:Express幫我做了什麼
打開瀏覽器開發者工具的Network分頁,檢查Response headers,發現多了一行完全沒自己寫過的內容:
X-Powered-By: Express
對照昨天用原生http十,Content-Type要自己動手setHeader才會出現;換成Express的res.send()後,這些標頭都被自動補上了。過程中也意外發現瀏覽器快取機制,重新整理時Status Code顯示304 Not Modified,代表瀏覽器直接使用了上次拿到的內容,沒有重新下載,要用Ctrl+Shift+R重新整理後才會看到完整的200 ok回應。
心得
原本用http模組要自己判斷req.url是哪個路徑,換成Express之後,app.get('/xxx', ...)直接對應一個路徑,程式碼乾淨了許多,不過也因為框架把很多事情藏起來了,如果前兩天沒有先搞懂原生http的運作方式,直接學Express可能會變成 會用但不知道背後在幹嘛,這也證實了一開始規劃 先手刻再學框架 的順序是對的。
今天另一個收穫是搬家:專案資料夾在D槽某個路徑下,Git一直出現Permission denied,怎麼用管理員權限開都只能解決一次,後來詢問claude之後,把整個專案資料夾搬到C槽的使用者資料夾底下才徹底的解決,看來是那個路徑被其他程式鎖定造成的。