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