目錄
前言
初識(shí)express
使用express創(chuàng)建基本的web服務(wù)器
初識(shí)express路由
路由匹配概念
路由模塊化
中間件
中間件和路由的區(qū)別
定義中間件函數(shù)
中間件作用?
?局部生效中間價(jià)
中間件分類
?1.應(yīng)用級(jí)別中間件
?2.路由級(jí)別的中間件
?3.錯(cuò)誤級(jí)別中間件
?4.內(nèi)置中間件
?5.自定義中間件
寫在最后
前言
express特別像node.js內(nèi)置的http模塊一樣,幫助我們來創(chuàng)建web服務(wù)器的,express實(shí)際上就是npm中的一個(gè)第三方的包,它里面提供了快捷創(chuàng)建Web服務(wù)器的方法,本篇將講到如何使用express進(jìn)行web服務(wù)器和路由的創(chuàng)建
初識(shí)express
既然是一個(gè)包那么首先就要進(jìn)行安裝這個(gè)包
使用npm i express@4.17.1來進(jìn)行安裝,安裝成功后就可以直接使用了
express給我們帶來的主要效果就是進(jìn)行一個(gè)服務(wù)器的創(chuàng)建,那么下面就讓我們一起來進(jìn)行一個(gè)最基本的服務(wù)器創(chuàng)建
使用express創(chuàng)建基本的web服務(wù)器
web服務(wù)器的創(chuàng)建一共分為三部
1.導(dǎo)入express
2.創(chuàng)建web服務(wù)器
3.調(diào)用app.listen(端口號(hào),回調(diào)函數(shù)),啟動(dòng)服務(wù)
// 導(dǎo)入express
const express = require('express');
// 創(chuàng)建web服務(wù)器
const app = express();
// 調(diào)用app.listen
app.listen(80, () => {
console.log('express server running at http://localhost');
})
這樣一個(gè)簡單的服務(wù)器就創(chuàng)建好了(這么一看和http的用法差不多嗎)
用get和post進(jìn)行一個(gè)請求的監(jiān)聽
● 監(jiān)聽GET請求
?● 監(jiān)聽post請求
?● 獲取URL中攜帶的查詢參數(shù)
通過req.query對象,可以訪問到客戶端通過查詢字符串的形式,發(fā)送到服務(wù)器的參數(shù)
● 獲取url中動(dòng)態(tài)參數(shù)
● 托管靜態(tài)資源
通過express.static()創(chuàng)建一個(gè)靜態(tài)資源服務(wù)器
?注:多次使用express.static()就可以得到多個(gè)靜態(tài)資源服務(wù)器了
初識(shí)express路由
在Express中,路由指的是客戶端的請求與服務(wù)器處理函數(shù)之間的映射關(guān)系。 Express中的路由由3部分組成,分別是請求的類型、請求的URL地址、處理函數(shù)
?METHON(請求類型) PATH(請求URL地址) HANDLER(處理函數(shù))
路由匹配概念
當(dāng)一個(gè)請求到達(dá)服務(wù)器之后,需要先經(jīng)過路由的匹配,匹配成功之后,調(diào)用對應(yīng)的處理函數(shù)。 在匹配時(shí),會(huì)按照路由的順序進(jìn)行匹配,如果請求類型和請求的URL同時(shí)匹配成功,Express會(huì)將這次請求,轉(zhuǎn)交給對應(yīng)的function函數(shù)進(jìn)行處理。(也就是說滿足請求類型和請求的URL同時(shí)匹配成功這個(gè)條件時(shí)才能進(jìn)行函數(shù)處理,否則不會(huì)進(jìn)行對客戶端的請求進(jìn)行處理)
注:路由會(huì)按照定義的先后順序自上而下進(jìn)行匹配,并且請求類型和請求的URL必須匹配成功才能進(jìn)行函數(shù)處理
1.導(dǎo)入express模塊。2,掛載路由。3,監(jiān)聽80端口
const express = require('express');
const app = express()
// 掛載路由
app.get('/', (req, res) => {
res.send('hello friend')
})
app.post('/', (req, res) => {
res.send('hello my friend')
})
app.listen(80, () => {
console.log('express server running at http://localhost');
})
路由模塊化
就是將路由模塊單獨(dú)提出來,進(jìn)行暴露共享,然后再供其他的模塊使用
const express = require('express');
// 導(dǎo)入express
const router = express.Router();
// 使用express.Router()創(chuàng)建路由對象
router.get('/user/list', (req, res) => {
res.send('GET user list. ');
});
router.post('/user/add', (req, res) => {
res.send('Add new user. ')
});
// 掛載路由
module.exports = router;
// 暴露共享對象
使用路由模塊
const express = require('express');
const app = express()
// 導(dǎo)入路由模塊
const router = require('./04路由模塊化.js')
// 注冊路由模塊,掛載前綴
app.use(router);
// app.use()用來注冊全局中間件
app.listen(80, () => {
console.log('express server running at http://localhost');
})
中間件
中間件和路由的區(qū)別
express的中間件本質(zhì)上是一個(gè)函數(shù),它類似于路由處理函數(shù)我們可以進(jìn)行一下對比
區(qū)分他倆的標(biāo)志就是next這個(gè)參數(shù),有next函數(shù)的就是中間件的處理函數(shù),沒有的就是路由處理函數(shù),在預(yù)處理中next函數(shù)至關(guān)重要next函數(shù)是實(shí)現(xiàn)多個(gè)中間件連續(xù)調(diào)用的關(guān)鍵,它表示把流轉(zhuǎn)關(guān)系轉(zhuǎn)交給下一一個(gè)中間件或路由。
定義中間件函數(shù)
跟路由很相似
const express = require('express');
const app = express();
// 定義一個(gè)簡單的中間件函數(shù)
const mw = (req, res, next) => {
console.log('中間件函數(shù)');
next();
}
app.listen(80, () => {
console.log('http://localhost');
})
全局中間件
就是客戶端無論發(fā)起什么請求,到達(dá)服務(wù)器之后都得出發(fā)的中間件叫做全局中間件
簡化中間件函數(shù)
中間件作用?
多個(gè)中間件之間,共享同一份req和res?;谶@樣的特性,我們可以在前面的的中間件中,統(tǒng)一為req或res對象添加自定義的屬性或方法,供后面的的中間件或路由進(jìn)行使用。(簡而言之,中間件里面的req,res可以供給后面的中間件或者是路由使用)
?局部生效中間價(jià)
不使用app.use()定義的中間件,叫做局部生效的中間件
const express = require('express');
const app = express();
// 1.定義中間件函數(shù)
const mw1 = (req, res, next) => {
console.log('局部中間件已調(diào)用');
next()
}
// 2.創(chuàng)建路由
app.get('/', mw1, (req, res) => {
res.send('Home page.')
})
app.get('/user', (req, res) => {
res.send('User page.')
})
app.listen(80, function () {
console.log('Express ');
})
注意事項(xiàng): ?
①一定要在路由之前注冊中間件 ②客戶端發(fā)送過來的請求,可以連續(xù)調(diào)用多個(gè)中間件進(jìn)行處理 ③執(zhí)行完中間件的業(yè)務(wù)代碼之后,不要忘記調(diào)用next()函數(shù) ④為了防止代碼邏輯混亂,調(diào)用next()函數(shù)后不要再寫額外的代碼 ⑤連續(xù)調(diào)用多個(gè)中間件時(shí),多個(gè)中間件之間,共享req和res對象
中間件分類
在express中,把中間件分為了五大類分別是
1.應(yīng)用級(jí)別中間件
(通過app.use()/app.get()/app.post(),綁定到app實(shí)例上的中間件)
?
?2.路由級(jí)別的中間件
?(綁定到express.Router(實(shí)例上的中間件,叫做路由級(jí)別的中間件。它的用法和應(yīng)用級(jí)別中間件沒有任何區(qū)別。只不過,應(yīng)用級(jí)別中間件是綁定到app實(shí)例上,路由級(jí)別中間件綁定到router實(shí)例上)
?3.錯(cuò)誤級(jí)別中間件
(專門用來捕獲整個(gè)項(xiàng)目中發(fā)生的異常錯(cuò)誤,從而防止項(xiàng)目異常崩潰的問題。錯(cuò)誤級(jí)別中間件的function處理函數(shù)中,必須有4個(gè)形參,形參順序從前到后,分別是(err, req, res, next),錯(cuò)誤級(jí)別的中間件一定要在路由后面否則不會(huì)執(zhí)行該錯(cuò)誤級(jí)別中間件。)
?4.內(nèi)置中間件
1.express.static快速托管靜態(tài)資源的內(nèi)置中間件
2.express.json解析JSON格式的請求體數(shù)據(jù)(4.16.0及以上版本可用)
3.express.urlencoded解析URL-encoded格式的請求體數(shù)據(jù)(4.16.0及以上版本可用)
?4.body-parser的使用
// 導(dǎo)入express 模塊
const express = require('express');
const app = express();
// 導(dǎo)入body-parser
const parser = require('body-parser');
// 注冊中間件
app.use(parser.urlencoded({ extended: false }))
app.post('/', (req, res) => {
// 如果沒有配置任何解析表單數(shù)據(jù)的中間件,則req. body默認(rèn)等于undefined
console.log(req.body);
res.send('ok')
})
app.listen(80, () => {
console.log('express server running at http://127.0.0.1');
})
5.自定義中間件
將該模塊進(jìn)行封裝
// 導(dǎo)入querystring內(nèi)置模塊
const qs = require('querystring');
const parser = (req, res, next) => {
// 用來儲(chǔ)存客戶端發(fā)送的數(shù)據(jù)
let str = ''
// 監(jiān)聽req的data事件
req.on('data', (chunk) => {
str += chunk;
})
// 監(jiān)聽req的end事件
req.on('end', () => {
// 打印儲(chǔ)存完整的請求體數(shù)據(jù)
// 使用querystring內(nèi)置模塊解析請求體數(shù)據(jù)
// 把字符串?dāng)?shù)據(jù)解析為對象格式
// 將解析出來的數(shù)據(jù)對象掛載為req.body
const body = qs.parse(str);
req.body = body;
next()
})
}
module.exports = parser;
?使用該模塊
const express = require('express');
const app = express();
// 導(dǎo)入querystring內(nèi)置模塊
const qs = require('querystring');
// 定義解析表單的中間件具體的業(yè)務(wù)邏輯
const cousttomParser = require('./12對自定義的中間件進(jìn)行模塊化')
app.use(cousttomParser)
app.post('/', (req, res) => {
res.send(req.body)
})
app.listen(80, () => {
console.log('express server running at http://127.0.0.1');
})
使用apipost發(fā)送請求
文章來源:http://www.zghlxwxcb.cn/news/detail-786253.html
寫在最后
點(diǎn)贊??:您的贊賞是我前進(jìn)的動(dòng)力!
收藏?:您的支持我是創(chuàng)作的源泉!
評(píng)論?:您的建議是我改進(jìn)的良藥!
山魚??的個(gè)人社區(qū):歡迎大家加——?山魚社區(qū)文章來源地址http://www.zghlxwxcb.cn/news/detail-786253.html
到了這里,關(guān)于【node.js從入門到精通】使用express創(chuàng)建web服務(wù)器,路由,進(jìn)行中間件的創(chuàng)建鏈接路由及其他中間件的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!