Express 簡(jiǎn)介
通俗的理解: Express 的作用和 Nodejs 內(nèi)置的 http 模塊類似,是專門用來(lái)創(chuàng)建 Web 服務(wù)器的.
Express 的本質(zhì):就是一個(gè)npm 上的第三方包楚堤,提供了快速創(chuàng)建 Web 服務(wù)器的便捷方法
有了 http 內(nèi)置模塊塞淹,為什么還有用 Express
htp 內(nèi)置模塊用起來(lái)很復(fù)雜,開發(fā)效率低晌畅,Express 是基于內(nèi)置的 http 模塊進(jìn)一步封裝出來(lái)的疹味,能夠極大的提高開發(fā)效率
Express 能做什么
1. Web 網(wǎng)站服務(wù)器: 專門對(duì)外提供 Web 網(wǎng)頁(yè)資源的服務(wù)器
2. API 接口服務(wù)器:專門對(duì)外提供 API 接口的服務(wù)器
使用 Express耍目,我們可以方便蚪黑、快速的創(chuàng)建 Web 網(wǎng)站的服務(wù)器或 API 接口的服務(wù)器
獲取URL中的動(dòng)態(tài)參數(shù):?app.get( ' /user/:d' , (req, res) => {})
創(chuàng)建一個(gè)靜態(tài)資源目錄: app.use("路由",express.static("資源路徑") )
nodemon自動(dòng)重啟
將 node 命令替換為 nodemon 命令盅惜,使用 nodemon app.js 來(lái)啟動(dòng)項(xiàng)目。
好處:代碼被修改之后忌穿,會(huì)被 nodemon 監(jiān)聽到抒寂,從而實(shí)現(xiàn)自動(dòng)重啟項(xiàng)目的效果。
Express 中的路由: 3 部分組成伴网,分別是請(qǐng)求的類型、請(qǐng)求的 URL 地址妆棒、處理函數(shù)
模塊化路由
1. 創(chuàng)建路由模塊對(duì)應(yīng)的js 文件
2. 調(diào)用 express.Router() 函數(shù)創(chuàng)建路由對(duì)象
3. 向路由對(duì)象上掛載具體的路由
4. 使用 module.exports 向外共享路由對(duì)象
5. 使用app.use()函數(shù)注冊(cè)路由模塊
app.use() 函數(shù)的作用澡腾,就是來(lái)注冊(cè)全局中間件
Express 中間件的調(diào)用流程:?當(dāng)一個(gè)請(qǐng)求到達(dá)Express的服務(wù)器之后,可以連續(xù)調(diào)用多個(gè)中間件糕珊,從而對(duì)這次請(qǐng)求進(jìn)行預(yù)處理动分。
Express 中間件的格式:?中間件函數(shù)的形參列表中,必須包含 next 參數(shù)红选。而路由處理函數(shù)中只包含 req 和res
next函數(shù)的作用
next 函數(shù)是實(shí)現(xiàn)多個(gè)中間件連續(xù)調(diào)用的關(guān)鍵澜公,它表示把流轉(zhuǎn)關(guān)系轉(zhuǎn)交給下一個(gè)中間件或路由
全局生效的中間件
客戶端發(fā)起的任何請(qǐng)求,到達(dá)服務(wù)器之后,都會(huì)觸發(fā)的中間件坟乾,叫做全局生效的中間件.通過(guò)調(diào)用 app.use(中間件函數(shù))迹辐,即可定義一個(gè)全局生效的中間件
中間件的作用
多個(gè)中間件之間,共享同一份 req 和 res甚侣∶鞣裕基于這樣的特性,我們可以在上游的中間件中殷费,統(tǒng)一為 req 或 res 對(duì)象添加自定義的屬性或方法印荔,供下游的中間件或路由進(jìn)行使用。
局部生效的中間件
不使用 app.use()定義的中間件详羡,叫做局部生效的中間件
中間件的5個(gè)使用注意事項(xiàng)
1. 一定要在路由之前注冊(cè)中間件
2. 客戶端發(fā)送過(guò)來(lái)的請(qǐng)求仍律,可以連續(xù)調(diào)用多個(gè)中間件進(jìn)行處理
3. 執(zhí)行完中間件的業(yè)務(wù)代碼之后,不要忘記調(diào)用 next0 函數(shù)
4.為了防止代碼邏輯混亂实柠,調(diào)用 next0 函后不要再寫額外的代碼
5. 連續(xù)調(diào)用多個(gè)中間件時(shí)水泉,多個(gè)中間件之間,共享 req 和 res 對(duì)象
中間件的分類
1.? 應(yīng)用級(jí)別的中間件
2. 路由級(jí)別的中間件
3. 錯(cuò)誤級(jí)別的中間件(除了錯(cuò)誤的中間件放到所有路由之后,其他的都放到路由之前)
4. Express 內(nèi)置的中間件 (static, json,urlencoded,)
5. 第三方的中間件
第三方的中間件
1. 運(yùn)行 npm install 中間件
2. 使用 require 導(dǎo)入中間件
3. 調(diào)用 app.use()注冊(cè)并使用中間件
監(jiān)聽req的data事件
req.on('data',(a)=>{})
req.on('end',(a)=>{})
接口的跨域問題
1. CORS (主流的解決方案主到,推薦使用)
2. JSONP (有缺陷的解決方案: 只支持 GET 請(qǐng)求)
簡(jiǎn)單請(qǐng)求和預(yù)檢請(qǐng)求的區(qū)別
簡(jiǎn)單請(qǐng)求的特點(diǎn): 客戶端與服務(wù)器之間只會(huì)發(fā)生一次請(qǐng)求茶行。
預(yù)檢請(qǐng)求的特點(diǎn): 客戶端與服務(wù)器之間會(huì)發(fā)生兩次請(qǐng)求,OPTION 預(yù)檢請(qǐng)求成功之后登钥,才會(huì)發(fā)起真正的請(qǐng)求
服務(wù)端染的 Web 開發(fā)模式
服務(wù)端渲染的概念:服務(wù)器發(fā)送給客戶端的 HTML 頁(yè)面畔师,是在服務(wù)器通過(guò)字符串的拼接,動(dòng)態(tài)生成的牧牢。因此看锉,客戶端不需要使用 Ajax這樣的技術(shù)額外請(qǐng)求頁(yè)面的數(shù)據(jù)。
優(yōu)點(diǎn):
1. 前端耗時(shí)少塔鳍。因?yàn)榉?wù)器端負(fù)責(zé)動(dòng)態(tài)生成 HTML 內(nèi)容伯铣,瀏覽器只需要直接染頁(yè)面即可。尤其是移動(dòng)端轮纫,更省電腔寡。
2. 有利于SEO。因?yàn)榉?wù)器端響應(yīng)的是完整的 HTML 頁(yè)面內(nèi)容掌唾,所以爬蟲更容易爬取獲得信息放前,更有利于 SEO。
缺點(diǎn):
1. 占用服務(wù)器端資源糯彬。即服務(wù)器端完成 HTML頁(yè)面內(nèi)容的拼接凭语,如果請(qǐng)求較多,會(huì)對(duì)服務(wù)器造成一定的訪問壓力撩扒。不利于前后端分離似扔,開發(fā)效率低。
2. 使用服務(wù)器端渲染,則無(wú)法進(jìn)行分工合作炒辉,尤其對(duì)于前端復(fù)雜度高的項(xiàng)目豪墅,不利于項(xiàng)目高效開發(fā)。
前后端分離開發(fā)模式
優(yōu)點(diǎn):
1. 開發(fā)體驗(yàn)好辆脸。前端專注于 UI頁(yè)面的開發(fā)但校,后端專注于api 的開發(fā),且前端有更多的選擇性啡氢。用戶體驗(yàn)好状囱。Ajax 技術(shù)的廣泛應(yīng)用,極大的提高了用戶的體驗(yàn)倘是,可以輕松實(shí)現(xiàn)頁(yè)面的局部刷新2. 減輕了服務(wù)器端的渲染壓力亭枷。因?yàn)轫?yè)面最終是在每個(gè)用戶的瀏覽器中生成的。
缺點(diǎn):
1. 不利于 SEO搀崭。因?yàn)橥暾?HTML 頁(yè)面需要在客戶端動(dòng)態(tài)拼接完成叨粘,所以爬蟲對(duì)無(wú)法爬取頁(yè)面的有效信息。(解決方1案:利用VueReact等前端框架的 SSR (server side render)技術(shù)能夠很好的解決 SEO 問題!)
身份認(rèn)證
1. 服務(wù)端渲染推薦使用 Session 認(rèn)證機(jī)制
2. 前后端分離推薦使用 JWT 認(rèn)證機(jī)制
什么是 Cookie(用于驗(yàn)證用戶身份)
Cookie 是存儲(chǔ)在用戶瀏覽器中的一段不超過(guò) 4 KB 的字符串瘤睹。它由一個(gè)名稱(Name)升敲、一個(gè)值(Value) 和其它幾個(gè)用于控制 Cookie 有效期、安全性轰传、使用范圍的可選屬性組成驴党。
不同域名下的 Cookie 各自獨(dú)立,每當(dāng)客戶端發(fā)起請(qǐng)求時(shí)获茬,會(huì)自動(dòng)把當(dāng)前域名下所有未過(guò)期的 Cookie 一同發(fā)送到服務(wù)器港庄。
Cookie的幾大特性:
1. 自動(dòng)發(fā)送
2. 域名獨(dú)立
3. 過(guò)期時(shí)限
4. 4KB 限制
Cookie 不具有安全性
由于 Cookie 是存儲(chǔ)在瀏覽器中的,而且瀏覽器也提供了讀寫 Cookie 的 API恕曲,因此 Cookie 很容易被偽造鹏氧,不具有安全性。因此不建議服務(wù)器將重要的隱私數(shù)據(jù)佩谣,通過(guò) Cookie 的形式發(fā)送給瀏覽器把还。
Session 認(rèn)證機(jī)制局限性
Session 認(rèn)證機(jī)制需要配合 Cookie 才能實(shí)現(xiàn)。由于 Cookie 默認(rèn)不支持跨域訪問茸俭,所以吊履,當(dāng)涉及到前端跨城請(qǐng)求后端接口的時(shí)候,需要做很多額外的配置瓣履,才能實(shí)現(xiàn)跨域 Session 認(rèn)證率翅。
注意:
1. 當(dāng)前端請(qǐng)求后端接口不存在跨域問題的時(shí)候练俐,推薦使用 Session 身份認(rèn)證機(jī)制
2. 當(dāng)前端需要跨域請(qǐng)求后端接口的時(shí)候袖迎,不推薦使用 Session 身份認(rèn)證機(jī)制,推薦使用JWT 認(rèn)證機(jī)制
JWT 由三部分組成: Header (頭部)、Payload (有效荷載)燕锥、Signature (簽名)辜贵。三者之間便用英文的“”分隔,格式如下: