一、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'));