Udemy課程:[The Web Developer Bootcamp 2021(Colt Steele)](https://www.udemy.com/course/the-web-developer-bootcamp/) # 第 33 節: Creating Servers With Express ###### tags: `JavaScript` `Udemy` `The Web Developer Bootcamp 2021` 2022.02.17(Thu.)~2022.02.18(Fri.) ## ● 上課筆記 ## 0. 酷 > [Node.js 系列學習日誌 #9 - 運用 express, socket.io, boostrap 建立一個簡單的聊天室功能](https://ithelp.ithome.com.tw/articles/10158724) ## 1. Our Very First Express App > 參考網址: > 1. [express官方文件](http://expressjs.com/) > 2. [Node.js — 從一個實例看Express 的運作方式](https://medium.com/web-design-zone/%E5%BE%9Enode-js-%E5%BE%9E%E4%B8%80%E5%80%8B%E5%AF%A6%E4%BE%8B%E7%9C%8Bexpress-%E7%9A%84%E9%81%8B%E4%BD%9C%E6%96%B9%E5%BC%8F-7c61cdd477f5) ```javascript= const express = require('express') const app = express() const port = 3000 app.use(() => { console.log("we got a new request!") }) app.listen(port, () => { console.log(`Example app listening on port ${port}`) }) ``` * 一行一行解釋: 1. 載入express,指定給變數express ```javascript= const express = require('express') ``` 2. 使用express,指定給變數app ```javascript= const app = express() }) ``` 3. 設定port的位置 ```javascript= const port = 3000 ``` ==問題== 什麼是port? ==解決== > 參考網址: > 1. [網路基礎概論 ─ 重點整理](https://hackmd.io/@Yu040419/S1raoZE3E) > 2. [[30 天學會 Web 前端效能優化] 2. 傳輸層簡述](https://ithelp.ithome.com.tw/articles/10155707) > 3. [關於Web後端(1)-什麼是Web Server?](https://medium.com/@justinlee_78563/%E9%97%9C%E6%96%BCweb%E5%BE%8C%E7%AB%AF-1-%E4%BB%80%E9%BA%BC%E6%98%AFweb-server-83ee32bc7d3e) 4. 監聽port ```javascript= app.listen(port) ``` 這時在terminal上執行該程式,並且在瀏覽器搜尋localhost:3000,會發現出現Cannot GET /的訊息。 5. 取得request時執行裡面的function ```javascript= app.use(() => { console.log("we got a new request!") }) ``` 不管取得的request從哪裡來,他都會執行此函式。 而在此範例中,當我們在terminal上執行該程式,並且在瀏覽器搜尋localhost:3000後,就等於對伺服器發出了request,因此在terminal上會得到"we got a new request!"的訊息。 不過瀏覽器會一直運轉,這是因為目前我們還沒寫出讓伺服器回傳response的程式碼。 ## 2. The Request & Response Objects > 可以到[express官方文件](http://expressjs.com/)上方導覽列中的API reference中,裡面點擊request,可以看到很多request的用法。 ```javascript= const express = require('express') const app = express() const port = 3000 app.use((req,res) => { console.log("we got a new request!") res.send("hello, we got your request!this is a response") }) app.listen(port, () => { console.log(`Example app listening on port ${port}`) }) ``` 把app.use抓出來獨立觀察: ```javascript= app.use((req,res) => { console.log("we got a new request!") res.send("hello, we got your request!this is a response" }) ``` 這次括號裡多了兩個object,一個是request,一個是response。(要叫做req或res看自己高興, ,只是多數都是這樣命名) * res.send() 與console.log()不同之處在於,console.log()只會跑在terminal,而res.send()裡的內容,則會當作response,回傳給瀏覽器,並顯示在瀏覽器上頁面。 另外,如果想輸入網址localhost:3000/cats,後面接/cats或任何東西,而有不同結果的話,則可使用以下的語法: ```javascript= app.get("/cats", (req,res)=>{ console.log("cat request!") }) ``` 如果照樣想輸入localhost:3000就好(不要後面的內容),則在前面加上"/"即可: ```javascript= app.get("/", (req,res)=>{ console.log("cat request!") }) ``` ## 3. Express Path Parameters > 參考資料: > 1. [Express routes parameters stack overflow](https://stackoverflow.com/questions/34704593/express-routes-parameters) > 2. [path example](http://expressjs.com/en/api.html#path-examples) ![](https://i.imgur.com/Ztq2jLN.png) 課程中的範例: ```javascript= app.get("/r/:subreddit",(req,res)=>{ res.send("this is a subreddit!") }) ``` 在terminal執行這個程式後,再到瀏覽器搜尋localhost:3000/r/###,井字號(###)部份可填任意內容,皆可得到"this is a subreddit!"的文字。 目前看下來的理解應該是在app.get()裡的連結,若有冒號,則可以隨意打任何內容去發送request,就像express官方文件截圖裡的`:id`以及課程範例中的`:subreddit`,在發出request時`:id`或`:subreddit`可替換輸入任何內容,結果都不變。 **** * req.params Params is for parameter(老師說的) ```javascript= app.get("/r/:subreddit",(req,res)=>{ consoe.log(req.params) res.send("this is a subreddit!") }) ``` ```javascript= const express = require("express") const app = express() const port = 3000 app.get("/r/:subreddit",(req,res)=>{ console.log(req.params) res.send("this is a subreddit!") }) app.get("/",(req,res)=>{ res.send("this is a home page!") }) app.get("/cats", (req,res)=>{ res.send("meow!") }) app.get("/dogs",(req,res)=>{ res.send("woof!") }) app.listen(port, ()=>{ console.log("listening on port 3000!") }) ``` 執行上述程式碼後,若在瀏覽器搜尋localhost:3000/r/gooood,則console.log(req.params)會在terminal上印出底下內容: ``` {subreddit: 'gooood'} ``` ## 4. Working With Query Strings ```javascript= app.get("/search",(req,res)=>{ const {q} = req.query res.send(`search result for ${q}`) }) ``` 執行上述程式碼後,在瀏覽器搜尋localhost:3000/search?q=hellooooooo,則會在網頁上印出search result for hellooooooo。 那假如只搜尋localhost:3000/searh,而沒有後方的?q=,則會顯示undefined。 為了防止這樣的事情發生,可用if else來解決,改成以下內容: ```javascript= app.get("/search",(req,res)=>{ const {q} = req.query if(!q){ res.send("nothing found if nothing searched!") } res.send(`search result for ${q}`) }) ``` ## 5. Auto-Restart With Nodemon 下載nodemon可在程式改動時,自動化取代node去執行程式碼。 (暫時沒下載) > 參考網址:[nodemon - npm](https://www.npmjs.com/package/nodemon) > 下載方法參考:The web developer bootcamp L338