Express路由

Express路由

一魂仍、Express路由簡介

路由表示應(yīng)用程序端點 (URI) 的定義以及響應(yīng)客戶端請求的方式嗡害。它包含一個請求方式(methods)奴拦、路徑(path)和路由匹配時的函數(shù)(callback);

app.methods(path, callback);

二、Express路由方法

Express方法源于 HTTP 方法之一垃僚,附加到 express 類的實例集绰。它可請求的方法包括:

get、post谆棺、put栽燕、head罕袋、delete、options碍岔、trace浴讯、copy、lock蔼啦、mkcol榆纽、move、purge捏肢、propfind奈籽、proppatch、unlock鸵赫、report衣屏、mkactivity、checkout辩棒、merge勾拉、m-search、notify盗温、subscribe、unsubscribe成肘、patch卖局、search 和 connect。

三双霍、路徑

Express路徑包含三種表達形式砚偶,分別為字符串、字符串模式洒闸、正則表達式

1.字符串路徑

app.get("/login",function(req,res){
    res.send("hello my name is express");
})

此路徑地址將與/login匹配

2.字符串模式路徑

此路由路徑將與acd或abcd相匹配

app.get('/ab?cd', function (req, res) {
    res.send('字符串模式')
})

這個路由的路徑將會匹配abcd染坯,abbcd,abbbcd丘逸,等等单鹿。

app.get('/ab+cd', function (req, res) {
    res.send('ab+cd')
})

這個路由的路徑將會匹配abcd,abxcd深纲,abRANDOMcd仲锄,ab123cd,等湃鹊。

app.get('/ab*cd', function (req, res) {
    res.send('ab*cd')
})

這個路由路徑將與/abe和相匹配/abcde儒喊。

app.get('/ab(cd)?e', function (req, res) {
    res.send('ab(cd)?e')
})

3.正則表達式路徑

這個路由路徑將匹配其中帶有“ a”的任何內(nèi)容。

app.get(/a/, function (req, res) {
    res.send('/a/')
})

這個路由路徑將匹配butterfly和dragonfly币呵,但不匹配butterflyman怀愧,dragonflyman等。

app.get(/.*fly$/, function (req, res) {
    res.send('/.*fly$/')
})

四、基礎(chǔ)路由

const express = require("express");
var app = express();

app.get("/",function(req,res){
    res.send(<h1>主頁</h1>);
});
  
app.get("/login",function(req,res){
    res.send(“登錄頁面”);
});
  
app.get("/registe",function(req,res){
    res.send(“注冊頁面”);
});
  
app.listen(8080);

輸入http://127.0.0.1:8080/loginhttp://127.0.0.1:8080/registe都能進入不同路由芯义。

五哈垢、動態(tài)路由

路線參數(shù)

路由參數(shù)被命名為URL段,用于捕獲URL中在其位置處指定的值毕贼。捕獲的值將填充到req.params對象中温赔,并將路徑中指定的route參數(shù)的名稱作為其各自的鍵。

Route path: /users/:userId/books/:bookId
Request URL: http://localhost:3000/users/34/books/8989
req.params: { "userId": "34", "bookId": "8989" }

要使用路由參數(shù)定義路由鬼癣,只需在路由路徑中指定路由參數(shù)即可

app.get('/users/:userId/books/:bookId', function (req, res) {
    res.send(req.params)
})

路徑參數(shù)的名稱必須由“文字字符”([A-Za-z0-9_])組成陶贼。

由于連字符(-)和點(.)是按字面解釋的,因此可以將它們與路由參數(shù)一起使用待秃,以實現(xiàn)有用的目的拜秧。

Route path: /flights/:from-:to
Request URL: http://localhost:3000/flights/LAX-SFO
req.params: { "from": "LAX", "to": "SFO" }
Route path: /plantae/:genus.:species
Request URL: http://localhost:3000/plantae/Prunus.persica
req.params: { "genus": "Prunus", "species": "persica" }

如果希望更好地控制路由參數(shù),匹配確切的字符串章郁,可以在括號(())后面附加一個正則表達式:

Route path: /user/:userId(\d+)
Request URL: http://localhost:3000/user/42
req.params: {"userId": "42"}
由于正則表達式通常是文字字符串的一部分枉氮,因此請確保\使用其他反斜杠對所有字符進行轉(zhuǎn)義,例如\d+暖庄。

在Express 4.x中聊替,不以常規(guī)方式解釋正則表達式中的字符。解決方法是使用{0,}代替培廓。這可能會在Express 5中修復(fù)惹悄。

路由處理程序

你可以提供行為類似于中間件的多個回調(diào)函數(shù)來處理請求。唯一的例外是這些回調(diào)可能會調(diào)用next('route')以繞過其余的路由回調(diào)肩钠。您可以使用此機制在路由上施加先決條件泣港,然后在沒有理由繼續(xù)使用當(dāng)前路由的情況下將控制權(quán)傳遞給后續(xù)路由。

路由處理程序可以采用函數(shù)价匠,函數(shù)數(shù)組或二者組合的形式当纱,如以下示例所示。

單個回調(diào)函數(shù)可以處理路由

app.get('/example/a', function (req, res) {
    res.send('Hello from A!')
})

多個回調(diào)函數(shù)可以處理一條路由(確保指定了next對象)

app.get('/example/b', function (req, res, next) {
    console.log('the response will be sent by the next function ...')
    next()
}, function (req, res) {
    res.send('Hello from B!')
})

如果愿意的話踩窖,你也可以使用函數(shù)數(shù)組的方式處理路由

var cb0 = function (req, res, next) {
console.log('CB0')
next()
}
var cb1 = function (req, res, next) {
console.log('CB1')
next()
}
var cb2 = function (req, res) {
res.send('Hello from C!')
}
app.get('/example/c', [cb0, cb1, cb2])

如果你希望將采用函數(shù)和函數(shù)數(shù)組相結(jié)合的方式處理路由坡氯,那么

var cb0 = function (req, res, next) {
    console.log('CB0')
next()
}
var cb1 = function (req, res, next) {
    console.log('CB1')
    next()
}
app.get('/example/d', [cb0, cb1], function (req, res, next) {
    console.log('the response will be sent by the next function ...')
    next()
}, function (req, res) {
    res.send('Hello from D!')
})

響應(yīng)方法

res響應(yīng)對象方法可以將響應(yīng)發(fā)送到客戶端,并終止請求洋腮。如果從路由處理程序中未調(diào)用這些方法廉沮,則客戶端請求將被掛起。

方法 作用
res.download() 下載文件
res.end() 結(jié)束請求
res.json() 發(fā)送JSON響應(yīng)徐矩。
res.jsonp() 發(fā)送帶有JSONP支持的JSON響應(yīng)滞时。
res.redirect() 重定向請求。
res.render() 渲染視圖模板滤灯。
res.send() 發(fā)送各種類型的響應(yīng)坪稽。
res.sendFile() 將文件作為八位字節(jié)流發(fā)送曼玩。
res.sendStatus() 設(shè)置響應(yīng)狀態(tài)代碼,并將其字符串表示形式發(fā)送為響應(yīng)正文窒百。

app.route()

您可以使用來為路由路徑創(chuàng)建可鏈接的路由處理程序app.route()黍判。由于路徑是在單個位置指定的,因此創(chuàng)建模塊化路由非常有幫助篙梢,減少冗余和錯別字也很有幫助顷帖。有關(guān)路由的更多信息,請參見:Router()文檔渤滞。

這是使用定義的鏈式路由處理程序的示例app.route()贬墩。

app.route('/book')
    .get(function (req, res) {
            res.send('Get a random book')
    })
    .post(function (req, res) {
        res.send('Add a book')
    })
    .put(function (req, res) {
        res.send('Update the book')
    })

快速路由器

使用express.Router創(chuàng)建模塊化的,可安裝的路由處理程序妄呕。
一個Router實例是一個完整的中間件和路由系統(tǒng); 因此陶舞,它通常被稱為“迷你應(yīng)用程序”。

以下示例將路由器創(chuàng)建為模塊绪励,在其中加載中間件功能肿孵,定義一些路由,并將路由器模塊安裝在主應(yīng)用程序的路徑上疏魏。

birds.js在app目錄中創(chuàng)建一個名為以下內(nèi)容的路由器文件:

var express = require('express')

var router = express.Router()

// middleware that is specific to this router
router.use(function timeLog (req, res, next) {
    console.log('Time: ', Date.now())
    next()
})

// define the home page route
router.get('/', function (req, res) {
    res.send('Birds home page')
})

// define the about route
router.get('/about', function (req, res) {
    res.send('About birds')
})

module.exports = router

然后停做,在應(yīng)用程序中加載路由器模塊:

var birds = require('./birds')
// ...
app.use('/birds', birds)

該應(yīng)用程序現(xiàn)在將能夠處理對/birds和的請求/birds/about,以及調(diào)用timeLog特定于該路由的中間件功能大莫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雅宾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子葵硕,更是在濱河造成了極大的恐慌,老刑警劉巖贯吓,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懈凹,死亡現(xiàn)場離奇詭異,居然都是意外死亡悄谐,警方通過查閱死者的電腦和手機介评,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爬舰,“玉大人们陆,你說我怎么就攤上這事∏橐伲” “怎么了坪仇?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長垃你。 經(jīng)常有香客問我椅文,道長喂很,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任皆刺,我火速辦了婚禮少辣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羡蛾。我一直安慰自己漓帅,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布痴怨。 她就那樣靜靜地躺著忙干,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腿箩。 梳的紋絲不亂的頭發(fā)上豪直,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音珠移,去河邊找鬼弓乙。 笑死,一個胖子當(dāng)著我的面吹牛钧惧,可吹牛的內(nèi)容都是我干的暇韧。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼浓瞪,長吁一口氣:“原來是場噩夢啊……” “哼懈玻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乾颁,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤涂乌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后英岭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湾盒,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年诅妹,在試婚紗的時候發(fā)現(xiàn)自己被綠了罚勾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡吭狡,死狀恐怖尖殃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情划煮,我是刑警寧澤送丰,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站弛秋,受9級特大地震影響蚪战,放射性物質(zhì)發(fā)生泄漏牵现。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一邀桑、第九天 我趴在偏房一處隱蔽的房頂上張望瞎疼。 院中可真熱鬧,春花似錦壁畸、人聲如沸贼急。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽太抓。三九已至,卻和暖如春令杈,著一層夾襖步出監(jiān)牢的瞬間走敌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工逗噩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掉丽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓异雁,卻偏偏與公主長得像捶障,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纲刀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350