昨天讓Server動起來之後,今天回到server.js,實際把瀏覽器傳來的request內容印出來看,搞懂瀏覽器與伺服器之間到底在傳遞什麼,過程中有遇到編碼問題,也讓我多學到了一課。
今天做的事
先補齊專案基本設地:執行npm init -y產生package.json,並新增.gitignore,把node_modules/排除在版本控制之外。接著修改server.js,把request的內容印出來:
const http = require('http');
const server = http.createServer((req, res) => {
console.log('請求方法:', req.method);
console.log('請求網址:', req.url);
console.log('請求標頭:', req.headers);
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
res.end('收到請求了');
});
server.listen(3000, () => {
console.log('伺服器啟動於 http://localhost:3000');
});
執行node server.js,打開瀏覽器連到 http://localhost:3000 ,終端機印出:
請求方法:GET
請求網址:/
請求標頭:{
host: 'localhost:3000',
connection: 'keep-alive',
'user-agent': 'Mozilla/5.0(Windows NT 10.0; Win64; x64)...',
'accept-language': 'zh-TW,zh;q=0.9,ko-KR;q=0.8,en-US;q=0.6,en;q=0.5',
...
}
然後也出現了第二筆:
請求方法:GET
請求網址:/favicon.ico
請求標頭:{ host: 'localhost:3000', ... }
卡關-中文變亂碼
一開始把res.end()裡的文字改成中文"收到請求了",結果發現瀏覽器畫面顯示問號的亂碼符號,詢問了claude之後才知道是我沒有指定編碼格式,瀏覽器不知道這段文字是utf-8,才會解析錯誤。
心得
原本以為打開一次網頁只會送出一個請求,結果到終端機那裡查看,發現有/還有/favicon.ico兩筆資料,原來瀏覽器會自動額外要一次網站小圖示,就算網站根本沒設定,這是我第一次直觀地看見瀏覽器默默在背後做的事情。另外在accept-language也看到了有趣的細節:zh-TW,zh;q=0.9,ko-KR;q=0.8,en-US;q=0.6,en;q=0.5,q=後面的數字其實是瀏覽器在告訴伺服器語言偏好的權重,繁中最高、其次是韓文、最後才是英文。還有亂碼事件也提醒了我,內容看得到不代表沒問題,有很多地方要自己跑一遍才會真的注意到。