摘要:這些路由方法指定當(dāng)應(yīng)用程序收到對指定路由端點(diǎn)和方法的請求時調(diào)用的回調(diào)函數(shù)有時稱為處理函數(shù),換句話說,應(yīng)用程序監(jiān)聽與指定路由和方法匹配的請求,并且當(dāng)它檢測到匹配時,它調(diào)用指定的回調(diào)函數(shù)。
路由
路由是指應(yīng)用程序的端點(diǎn)(URI)如何響應(yīng)客戶端請求,有關(guān)路由的介紹,請參閱路由基礎(chǔ)。
使用與HTTP方法相對應(yīng)的Express app對象的方法定義路由,例如,app.get()用于處理GET請求,app.post()用于處理POST請求,有關(guān)完整列表,請參閱app.METHOD。你還可以使用app.all()來處理所有HTTP方法,并使用app.use()將中間件指定為回調(diào)函數(shù)(有關(guān)詳細(xì)信息,請參閱使用中間件)。
這些路由方法指定當(dāng)應(yīng)用程序收到對指定路由(端點(diǎn))和HTTP方法的請求時調(diào)用的回調(diào)函數(shù)(有時稱為“處理函數(shù)”),換句話說,應(yīng)用程序“監(jiān)聽”與指定路由和方法匹配的請求,并且當(dāng)它檢測到匹配時,它調(diào)用指定的回調(diào)函數(shù)。
實(shí)際上,路由方法可以有多個回調(diào)函數(shù)作為參數(shù),使用多個回調(diào)函數(shù)時,重要的是提供next作為回調(diào)函數(shù)的參數(shù),然后在函數(shù)體內(nèi)調(diào)用next()以將控制權(quán)交給下一個回調(diào)。
以下代碼是一個非?;A(chǔ)的路由示例。
var express = require("express") var app = express() // respond with "hello world" when a GET request is made to the homepage app.get("/", function (req, res) { res.send("hello world") })路由方法
路由方法是從其中一個HTTP方法派生的,并附加到express類的實(shí)例。
以下代碼是為應(yīng)用程序根目錄的GET和POST方法定義的路由示例。
// GET method route app.get("/", function (req, res) { res.send("GET request to the homepage") }) // POST method route app.post("/", function (req, res) { res.send("POST request to the homepage") })
Express支持與所有HTTP請求方法相對應(yīng)的方法:get、post等,有關(guān)完整列表,請參閱app.METHOD。
有一種特殊的路由方法app.all(),用于在路徑上為所有HTTP請求方法加載中間件函數(shù),例如,無論是使用GET、POST、PUT、DELETE還是http模塊支持的任何其他HTTP請求方法,都會對路由“/secret”的請求執(zhí)行以下處理程序。
app.all("/secret", function (req, res, next) { console.log("Accessing the secret section ...") next() // pass control to the next handler })路由路徑
路由路徑與請求方法結(jié)合,定義可以發(fā)出請求的端點(diǎn),路由路徑可以是字符串、字符串模式或正則表達(dá)式。
字符?、+、*和()是它們的正則表達(dá)式對應(yīng)物的子集,連字符(-)和點(diǎn)(.)由字符串路徑按字面解釋。
如果你需要在路徑字符串中使用美元字符($),請將其包含在([和])中,例如,“/data/$book”處的請求的路徑字符串將是“/data/([$])book”。
Express使用path-to-regexp來匹配路由路徑,有關(guān)定義路由路徑的所有可能性,請參閱path-to-regexp文檔,Express Route Tester是一個用于測試基本Express路由的便捷工具,但它不支持模式匹配。查詢字符串不是路由路徑的一部分。
以下是基于字符串的路由路徑的一些示例。
此路由路徑將匹配對根路由/的請求。
app.get("/", function (req, res) { res.send("root") })
此路由路徑將匹配/about的請求。
app.get("/about", function (req, res) { res.send("about") })
此路由路徑將匹配對/random.text的請求。
app.get("/random.text", function (req, res) { res.send("random.text") })
以下是基于字符串模式的路由路徑的一些示例。
此路由路徑將匹配acd和abcd。
app.get("/ab?cd", function (req, res) { res.send("ab?cd") })
此路由路徑將匹配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") })
基于正則表達(dá)式的路由路徑示例:
此路由路徑將匹配其中包含“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$/") })路由參數(shù)
路由參數(shù)是命名的URL片段,用于捕獲在URL中的位置指定的值,捕獲的值填充在req.params對象中,在路徑中指定的路由參數(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_])組成。
由于連字符(-)和點(diǎn)(.)按字面解釋,因此它們可以與路由參數(shù)一起使用以用于有用的目的。
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ù)可以匹配的確切字符串,可以在括號(())中附加正則表達(dá)式:
Route path: /user/:userId(d+) Request URL: http://localhost:3000/user/42 req.params: {"userId": "42"}
因?yàn)檎齽t表達(dá)式通常是文字字符串的一部分,所以請務(wù)必使用額外的反斜杠轉(zhuǎn)義任何字符,例如d+。路由處理程序在Express 4.x中,正則表達(dá)式中的*字符不以通常的方式解釋,要解決此問題,請使用{0,}而不是*,這可能會在Express 5中修復(fù)。
你可以提供多個回調(diào)函數(shù),其行為類似于中間件來處理請求,唯一的例外是這些回調(diào)可能會調(diào)用next("route")來繞過剩余的路由回調(diào),你可以使用此機(jī)制在路由上施加前置條件,然后在沒有理由繼續(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!") })
一組回調(diào)函數(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ù)組的組合可以處理路由,例如:
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)方法
下表中的響應(yīng)對象(res)上的方法可以向客戶端發(fā)送響應(yīng),并終止請求—響應(yīng)周期,如果沒有從路由處理程序調(diào)用這些方法,則客戶端請求將保持掛起狀態(tài)。
方法 | 描述 |
---|---|
res.download() | 提示下載文件 |
res.end() | 結(jié)束響應(yīng)過程 |
res.json() | 發(fā)送JSON響應(yīng) |
res.jsonp() | 使用JSONP支持發(fā)送JSON響應(yīng) |
res.redirect() | 重定向請求 |
res.render() | 渲染視圖模板 |
res.send() | 發(fā)送各種類型的響應(yīng) |
res.sendFile() | 將文件作為八位字節(jié)流發(fā)送 |
res.sendStatus() | 設(shè)置響應(yīng)狀態(tài)碼并將其字符串表示形式作為響應(yīng)體發(fā)送 |
你可以使用app.route()為路由路徑創(chuàng)建可鏈接的路由處理程序,由于路徑是在單個位置指定的,因此創(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
使用express.Router類創(chuàng)建模塊化、可裝載的路由處理程序,Router實(shí)例是一個完整的中間件和路由系統(tǒng),因此,它通常被稱為“迷你應(yīng)用程序”。
以下示例將路由器創(chuàng)建為模塊,在其中加載中間件功能,定義一些路由,并將路由器模塊裝載在主應(yīng)用程序中的路徑上。
在應(yīng)用程序目錄中創(chuàng)建名為birds.js的路由器文件,其中包含以下內(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中間件函數(shù)。
上一篇:常見問題 下一篇:編寫中間件文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/100459.html
摘要:常見問題我該如何構(gòu)建我的應(yīng)用程序這個問題沒有明確的答案,答案取決于你的應(yīng)用程序規(guī)模和所涉及的團(tuán)隊(duì),為了盡可能靈活,在結(jié)構(gòu)方面沒有做出任何假設(shè)。請參閱,了解以模型為中心的基于的框架。 常見問題 我該如何構(gòu)建我的應(yīng)用程序? 這個問題沒有明確的答案,答案取決于你的應(yīng)用程序規(guī)模和所涉及的團(tuán)隊(duì),為了盡可能靈活,Express在結(jié)構(gòu)方面沒有做出任何假設(shè)。 在你喜歡的任何目錄結(jié)構(gòu)中,路由和其他特定于...
摘要:路由基礎(chǔ)路由是指確定應(yīng)用程序如何響應(yīng)對特定端點(diǎn)的客戶端請求,該請求是或路徑和特定請求方法,等。路由定義采用以下結(jié)構(gòu)是的一個實(shí)例。是匹配到路由時執(zhí)行的函數(shù)。 路由基礎(chǔ) 路由是指確定應(yīng)用程序如何響應(yīng)對特定端點(diǎn)的客戶端請求,該請求是URI(或路徑)和特定HTTP請求方法(GET,POST等)。 每個路由都可以有一個或多個處理函數(shù),這些函數(shù)在路由匹配時執(zhí)行。 路由定義采用以下結(jié)構(gòu): app.M...
摘要:調(diào)用堆棧中的下一個中間件函數(shù)。此示例顯示了一個中間件子堆棧,它處理對路徑的請求。要從路由器中間件堆棧跳過其余的中間件函數(shù),請調(diào)用將控制權(quán)傳遞給下一個路由,注意僅適用于使用或函數(shù)加載的中間件函數(shù)。 使用中間件 Express是一個路由和中間件Web框架,其本身的功能非常小:Express應(yīng)用程序本質(zhì)上是一系列中間件函數(shù)調(diào)用。 中間件函數(shù)是可以訪問請求對象(req)、響應(yīng)對象(res)以及...
摘要:在向頁面發(fā)送內(nèi)容時,程序也不會往下執(zhí)行我們也可以裝在一組中間件路由級中間件路由級中間件和應(yīng)用級中間件一樣,只是它綁定的對象為。安裝所需功能的模塊,并在應(yīng)用中加載,可以在應(yīng)用級加載,也可以在路由級加載。 Express 框架 根據(jù)官方的介紹,Express 是一個基于 Node.js 平臺的極簡、靈活的 web 應(yīng)用開發(fā)框架,可以輕松的創(chuàng)建各種 web 或者移動端應(yīng)用 今天就來簡單的了解...
摘要:編寫中間件中間件函數(shù)是可以訪問請求對象響應(yīng)對象以及應(yīng)用程序請求響應(yīng)周期中的函數(shù)的函數(shù),函數(shù)是路由器中的一個函數(shù),當(dāng)被調(diào)用時,它會在當(dāng)前中間件之后執(zhí)行中間件。結(jié)束請求響應(yīng)周期。此外,根路徑路由的回調(diào)函數(shù)使用中間件函數(shù)添加到請求對象的屬性。 編寫中間件 中間件函數(shù)是可以訪問請求對象(req)、響應(yīng)對象(res)以及應(yīng)用程序請求—響應(yīng)周期中的next函數(shù)的函數(shù),next函數(shù)是Express路...
閱讀 4001·2021-09-23 11:51
閱讀 3137·2021-09-22 15:59
閱讀 1009·2021-09-09 11:37
閱讀 2159·2021-09-08 09:45
閱讀 1344·2019-08-30 15:54
閱讀 2153·2019-08-30 15:53
閱讀 557·2019-08-29 12:12
閱讀 3364·2019-08-29 11:15