Express框架

一、Express框架

(1)定義

Express是一個(gè)基于Node平臺的web應(yīng)用開發(fā)框架漏益,它提供了一系列的強(qiáng)大特性,幫助你創(chuàng)建各種Web應(yīng)用。
使用 npm install express 命令進(jìn)行下載狼讨。

(2)Express框架特性

① 提供了方便簡潔的路由定義方式
② 對獲取HTTP請求參數(shù)進(jìn)行了簡化處理
③ 對模板引擎支持程度高,方便渲染動(dòng)態(tài)HTML頁面
④ 提供了中間件機(jī)制有效控制HTTP請求
⑤ 擁有大量第三方中間件對功能進(jìn)行擴(kuò)展

二柒竞、基本使用步驟

(1)引入Express框架

let express = require('express')

(2)使用框架創(chuàng)建web服務(wù)器

通過express函數(shù)政供,創(chuàng)建并返回一個(gè)web服務(wù)器對象。

let app = express()

(3)程序監(jiān)聽端口

啟動(dòng)服務(wù)器朽基,并監(jiān)聽一個(gè)端口號(端口號是自定義的)布隔。

app.listen(8848,()=>{
    console.log('服務(wù)器成功開啟,端口號是8848');
})

(4)客戶端訪問路由

啟動(dòng)服務(wù)器稼虎,并監(jiān)聽一個(gè)端口號(端口號是自定義的)衅檀。

// 當(dāng)客戶端以get方式訪問/路由時(shí)
app.get('/', (req, res) => {
   // 對客戶端做出響應(yīng),send方法會(huì)根據(jù)內(nèi)容的類型自動(dòng)設(shè)置請求頭
   res.send('Hello Express'); // <h2>Hello Express</h2>   {say: 'hello'}
});

三霎俩、路由

路由(Routing)是由一個(gè) URI(或者叫路徑)和一個(gè)特定的 HTTP 方法(GET哀军、POST 等) 組成的,涉及到應(yīng)用如何響應(yīng)客戶端對某個(gè)網(wǎng)站節(jié)點(diǎn)的訪問打却。

(1)客戶端以get方式訪問 / 路由

app.get('/', (req, res) => {
   // 對客戶端做出響應(yīng)
   res.send('使用get方式請求了/路由'');
});

(2)客戶端以post方式訪問 /add 路由

app.post('/add', (req, res) => {
   res.send('使用post方式請求了/add路由');
});

(3)使用get/post方式訪問 /add 路由

所有方式杉适,app.all()優(yōu)先級最高。

app.all('/add',(req,res)=>{
   res.send('使用get/post方式請求了/add路由');
})

四柳击、中間件

1猿推、中間件定義

中間件就是一堆方法,可以接收客戶端發(fā)來的請求捌肴、可以對請求做出響應(yīng)蹬叭,也可以將請求繼續(xù)交給下一個(gè)中間件繼續(xù)處理。
中間件主要由兩部分構(gòu)成状知,中間件方法以及請求處理函數(shù)秽五。中間件方法由Express提供,負(fù)責(zé)攔截請求试幽;請求處理函數(shù)由開發(fā)人員提供筝蚕,負(fù)責(zé)處理請求。

app.get('請求路徑', '處理函數(shù)') // 接收并處理get請求
app.post('請求路徑', '處理函數(shù)') // 接收并處理post請求

可以針對同一個(gè)請求設(shè)置多個(gè)中間件铺坞,對同一個(gè)請求進(jìn)行多次處理起宽。默認(rèn)情況下,請求從上到下依次匹配中間件济榨,一旦匹配成功坯沪,終止匹配∏芑可以調(diào)用next方法將請求的控制權(quán)交給下一個(gè)中間件腐晾,直到遇到結(jié)束請求的中間件叉弦。

app.get('/request', (req, res, next) => {
      req.name = "張三";
      next();
});
app.get('/request', (req, res) => {
      res.send(req.name);
});

2、app.use中間件用法

app.use 匹配所有的請求方式藻糖,可以直接傳入請求處理函數(shù)淹冰,代表接收所有的請求。所有的請求巨柒,都會(huì)先走use樱拴,作用是攔截器。
實(shí)際開發(fā)中洋满,我們可以通過use中間件方法去判斷用戶的權(quán)限晶乔,從而確定該用戶能否繼續(xù)請求相關(guān)接口。

app.use((req,res,next)=>{
    console.log(req.url);
    // next方法牺勾,表示繼續(xù)往下執(zhí)行
    next()
})

app.use 第一個(gè)參數(shù)也可以傳入請求地址正罢,代表不論什么請求方式,只要是這個(gè)請求地址就接收這個(gè)請求驻民。

app.use('/admin', (req,res,next)=>{
    console.log(req.url);
    // next方法翻具,表示繼續(xù)往下執(zhí)行
    next()
})

3、中間件應(yīng)用

(1)路由保護(hù)川无,客戶端在訪問需要登錄的頁面時(shí)呛占,可以先使用中間件判斷用戶登錄狀態(tài)虑乖,用戶如果未登錄懦趋,則攔截請求,直接響應(yīng)疹味,禁止用戶進(jìn)入需要登錄的頁面仅叫。
(2)網(wǎng)站維護(hù)公告,在所有路由的最上面定義接收所有請求的中間件糙捺,直接為客戶端做出響應(yīng)诫咱,網(wǎng)站正在維護(hù)中。
(3)自定義404頁面洪灯。

4坎缭、錯(cuò)誤處理中間件

在程序執(zhí)行的過程中,不可避免的會(huì)出現(xiàn)一些無法預(yù)料的錯(cuò)誤签钩,比如文件讀取失敗掏呼,數(shù)據(jù)庫連接失敗。
錯(cuò)誤處理中間件是一個(gè)集中處理錯(cuò)誤的地方铅檩。

app.use((err, req, res, next) => {
   res.status(500).send('服務(wù)器發(fā)生未知錯(cuò)誤');
})

當(dāng)程序出現(xiàn)錯(cuò)誤時(shí)憎夷,調(diào)用next()方法,并且將錯(cuò)誤信息通過參數(shù)的形式傳遞給next()方法昧旨,即可觸發(fā)錯(cuò)誤處理中間件拾给。

app.get("/", (req, res, next) => {
   fs.readFile("/file-does-not-exist", (err, data) => {
       if (err) {
          next(err);
       }
   });
});

5祥得、捕獲錯(cuò)誤

在node.js中,異步API的錯(cuò)誤信息都是通過回調(diào)函數(shù)獲取的蒋得,支持Promise對象的異步API發(fā)生錯(cuò)誤可以通過catch方法捕獲级及。
異步函數(shù)執(zhí)行如果發(fā)生錯(cuò)誤,通過 try...catch 可以捕獲異步函數(shù)以及其他同步代碼在執(zhí)行過程中發(fā)生的錯(cuò)誤额衙。

app.get("/", async (req, res, next) => {
   try {
       await User.find({name: '張三'})
   }catch(ex) {
       next(ex);
   }
});

五创千、跨域

1、定義

同源策略:是瀏覽器的一種安全策略入偷。
同源:協(xié)議名追驴、主機(jī)名(域名或ip地址)、端口號必須完全相同疏之。
跨域:就是違背同源策略殿雪。
ajax請求,必須要遵循同源策略锋爪。

2丙曙、解決跨域

(1)JSONP

JSONP是一個(gè)非官方的跨域解決方案。JSONP 就是利用script標(biāo)簽的跨域能力來發(fā)送請求的其骄,只支持get請求亏镰。
例如:img、link拯爽、iframe索抓、script。

(2)CORS

CORS跨域資源共享毯炮,是官方的跨域解決方案逼肯。
跨源資源共享標(biāo)準(zhǔn)新增了一組HTTP首部字段,允許服務(wù)器聲明哪些源站通過瀏覽器有權(quán)限訪問哪些資源桃煎。
設(shè)置響應(yīng)頭篮幢,允許跨域請求:

response.setHeader('Access-Control-Allow-Origin','*')

允許自定義請求頭信息,響應(yīng)頭*表示所有類型的頭信息都可以接受:

response.setHeader('Access-Control-Allow-Headers','*')

六为迈、get請求

1三椿、get請求參數(shù)的獲取

req.query接收前端傳遞的GET請求參數(shù),框架內(nèi)部會(huì)將GET參數(shù)轉(zhuǎn)換為對象并返回葫辐。
接收地址欄中問號后面的參數(shù)搜锰,例如: http://localhost:3000/getStudents?name=zhangsan&age=30

app.get('/getStudents',(req,res)=>{
    console.log(req.query);  // {"name": "zhangsan", "age": "30"}
})

2、定義get請求接口

req是請求對象另患,里面保存的是客戶端傳過來的請求參數(shù)纽乱。
res是響應(yīng)對象,用于給客戶端響應(yīng)結(jié)果昆箕。
res.send()將結(jié)果返回給前端鸦列。

app.get('/getStudents',(req,res)=>{
    console.log(req.query);  // 獲取GET參數(shù)
    res.send('hello')
})

七租冠、post請求

1、post請求參數(shù)的獲取

req.body接收前端傳遞過來的POST請求參數(shù)薯嗤。

接收POST請求參數(shù)顽爹,服務(wù)器需要進(jìn)行設(shè)置。
(1)通過express.json()中間件骆姐,解析表單中的JSON格式數(shù)據(jù)镜粤。
(2)通過express.urlencoded()中間件,解析表單中的url-encoded格式數(shù)據(jù)玻褪。

// 設(shè)置允許接收json格式的數(shù)據(jù)({"name":"張三","age":20})
app.use(express.json())
// 設(shè)置允許接收urlencoded格式的數(shù)據(jù)("name=張三&age=20")
app.use(express.urlencoded({extended:false}))

2肉渴、定義post請求接口

app.post('/add', (req, res) => {
    console.log(req.body);  // 獲取POST參數(shù)
    res.send('hello')
})

八、靜態(tài)資源的處理

通過Express內(nèi)置的express.static可以方便地托管靜態(tài)文件带射,例如img同规、CSS、JavaScript 文件等窟社。
設(shè)置后券勺,public 目錄下面的文件就可以訪問了。

app.use(express.static('public'));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灿里,一起剝皮案震驚了整個(gè)濱河市关炼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匣吊,老刑警劉巖儒拂,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缀去,居然都是意外死亡侣灶,警方通過查閱死者的電腦和手機(jī)甸祭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門缕碎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來召夹,“玉大人炒瘟,你說我怎么就攤上這事∠こ恚” “怎么了校焦?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵赊抖,是天一觀的道長。 經(jīng)常有香客問我寨典,道長氛雪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任耸成,我火速辦了婚禮报亩,結(jié)果婚禮上浴鸿,老公的妹妹穿的比我還像新娘。我一直安慰自己弦追,他們只是感情好岳链,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著劲件,像睡著了一般掸哑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上零远,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天苗分,我揣著相機(jī)與錄音,去河邊找鬼牵辣。 笑死俭嘁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的服猪。 我是一名探鬼主播供填,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼罢猪!你這毒婦竟也來了近她?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤膳帕,失蹤者是張志新(化名)和其女友劉穎粘捎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體危彩,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攒磨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汤徽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娩缰。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谒府,靈堂內(nèi)的尸體忽然破棺而出拼坎,到底是詐尸還是另有隱情,我是刑警寧澤完疫,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布泰鸡,位于F島的核電站,受9級特大地震影響壳鹤,放射性物質(zhì)發(fā)生泄漏盛龄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望余舶。 院中可真熱鬧蹦锋,春花似錦、人聲如沸欧芽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽千扔。三九已至憎妙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曲楚,已是汗流浹背厘唾。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留龙誊,地道東北人抚垃。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像趟大,于是被迫代替她去往敵國和親鹤树。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容