摘要:調(diào)用堆棧中的下一個(gè)中間件函數(shù)。此示例顯示了一個(gè)中間件子堆棧,它處理對(duì)路徑的請(qǐng)求。要從路由器中間件堆棧跳過(guò)其余的中間件函數(shù),請(qǐng)調(diào)用將控制權(quán)傳遞給下一個(gè)路由,注意僅適用于使用或函數(shù)加載的中間件函數(shù)。
使用中間件
Express是一個(gè)路由和中間件Web框架,其本身的功能非常?。篍xpress應(yīng)用程序本質(zhì)上是一系列中間件函數(shù)調(diào)用。
中間件函數(shù)是可以訪問(wèn)請(qǐng)求對(duì)象(req)、響應(yīng)對(duì)象(res)以及應(yīng)用程序請(qǐng)求—響應(yīng)周期中的下一個(gè)中間件函數(shù)的函數(shù),下一個(gè)中間件函數(shù)通常由名為next的變量表示。
中間件函數(shù)可以執(zhí)行以下任務(wù):
執(zhí)行任何代碼。
更改請(qǐng)求和響應(yīng)對(duì)象。
結(jié)束請(qǐng)求—響應(yīng)周期。
調(diào)用堆棧中的下一個(gè)中間件函數(shù)。
如果當(dāng)前的中間件函數(shù)沒(méi)有結(jié)束請(qǐng)求—響應(yīng)周期,它必須調(diào)用next()將控制權(quán)傳遞給下一個(gè)中間件函數(shù),否則,請(qǐng)求將被掛起。
Express應(yīng)用程序可以使用以下類型的中間件:
應(yīng)用程序級(jí)中間件
路由器級(jí)中間件
錯(cuò)誤處理中間件
內(nèi)置中間件
第三方中間件
你可以使用可選的裝載路徑加載應(yīng)用程序級(jí)和路由器級(jí)中間件,你還可以將一系列中間件函數(shù)加載在一起,從而在裝載點(diǎn)創(chuàng)建中間件系統(tǒng)的子堆棧。
應(yīng)用程序級(jí)中間件使用app.use()和app.METHOD()函數(shù)將應(yīng)用程序級(jí)中間件綁定到app對(duì)象的實(shí)例,其中METHOD是中間件函數(shù)處理的請(qǐng)求的小寫HTTP方法(例如GET,PUT或POST)。
此示例顯示了沒(méi)有裝載路徑的中間件函數(shù),每次應(yīng)用程序收到請(qǐng)求時(shí)都會(huì)執(zhí)行該函數(shù)。
var app = express() app.use(function (req, res, next) { console.log("Time:", Date.now()) next() })
此示例顯示了安裝在/user/:id路徑上的中間件函數(shù),對(duì)/user/:id路徑上的任何類型的HTTP請(qǐng)求執(zhí)行該函數(shù)。
app.use("/user/:id", function (req, res, next) { console.log("Request Type:", req.method) next() })
此示例顯示了路由及其處理函數(shù)(中間件系統(tǒng)),該函數(shù)處理對(duì)/user/:id路徑的GET請(qǐng)求。
app.get("/user/:id", function (req, res, next) { res.send("USER") })
下面是一個(gè)使用掛載路徑在掛載點(diǎn)加載一系列中間件函數(shù)的示例,它說(shuō)明了一個(gè)中間件子堆棧,它將任何類型的HTTP請(qǐng)求的請(qǐng)求信息打印到/user/:id路徑。
app.use("/user/:id", function (req, res, next) { console.log("Request URL:", req.originalUrl) next() }, function (req, res, next) { console.log("Request Type:", req.method) next() })
路由處理程序使你可以為路徑定義多個(gè)路由,下面的示例為/user/:id路徑定義了兩個(gè)GET請(qǐng)求路由,第二個(gè)路由不會(huì)引起任何問(wèn)題,但它永遠(yuǎn)不會(huì)被調(diào)用,因?yàn)榈谝粋€(gè)路由結(jié)束了請(qǐng)求—響應(yīng)周期。
此示例顯示了一個(gè)中間件子堆棧,它處理對(duì)/user/:id路徑的GET請(qǐng)求。
app.get("/user/:id", function (req, res, next) { console.log("ID:", req.params.id) next() }, function (req, res, next) { res.send("User Info") }) // handler for the /user/:id path, which prints the user ID app.get("/user/:id", function (req, res, next) { res.end(req.params.id) })
要從路由器中間件堆棧跳過(guò)其余的中間件函數(shù),請(qǐng)調(diào)用next("route")將控制權(quán)傳遞給下一個(gè)路由,注意:next("route")僅適用于使用app.METHOD()或router.METHOD()函數(shù)加載的中間件函數(shù)。
此示例顯示了一個(gè)中間件子堆棧,它處理對(duì)/user/:id路徑的GET請(qǐng)求。
app.get("/user/:id", function (req, res, next) { // if the user ID is 0, skip to the next route if (req.params.id === "0") next("route") // otherwise pass the control to the next middleware function in this stack else next() }, function (req, res, next) { // send a regular response res.send("regular") }) // handler for the /user/:id path, which sends a special response app.get("/user/:id", function (req, res, next) { res.send("special") })路由器級(jí)中間件
路由器級(jí)中間件的工作方式與應(yīng)用程序級(jí)中間件的工作方式相同,只是它綁定到express.Router()的實(shí)例。
var router = express.Router()
使用router.use()和router.METHOD()函數(shù)加載路由器級(jí)中間件。
以下示例代碼通過(guò)使用路由器級(jí)中間件復(fù)制上面顯示的應(yīng)用程序級(jí)中間件的中間件系統(tǒng):
var app = express() var router = express.Router() // a middleware function with no mount path. This code is executed for every request to the router router.use(function (req, res, next) { console.log("Time:", Date.now()) next() }) // a middleware sub-stack shows request info for any type of HTTP request to the /user/:id path router.use("/user/:id", function (req, res, next) { console.log("Request URL:", req.originalUrl) next() }, function (req, res, next) { console.log("Request Type:", req.method) next() }) // a middleware sub-stack that handles GET requests to the /user/:id path router.get("/user/:id", function (req, res, next) { // if the user ID is 0, skip to the next router if (req.params.id === "0") next("route") // otherwise pass control to the next middleware function in this stack else next() }, function (req, res, next) { // render a regular page res.render("regular") }) // handler for the /user/:id path, which renders a special page router.get("/user/:id", function (req, res, next) { console.log(req.params.id) res.render("special") }) // mount the router on the app app.use("/", router)
要跳過(guò)其余路由器中間件函數(shù),請(qǐng)調(diào)用next("router")將控制權(quán)交還出路由器實(shí)例。
此示例顯示了一個(gè)中間件子堆棧,它處理對(duì)/admin路徑的GET請(qǐng)求。
var app = express() var router = express.Router() // predicate the router with a check and bail out when needed router.use(function (req, res, next) { if (!req.headers["x-auth"]) return next("router") next() }) router.get("/", function (req, res) { res.send("hello, user!") }) // use the router and 401 anything falling through app.use("/admin", router, function (req, res) { res.sendStatus(401) })錯(cuò)誤處理中間件
錯(cuò)誤處理中間件總是需要四個(gè)參數(shù),你必須提供四個(gè)參數(shù)以將其標(biāo)識(shí)為錯(cuò)誤處理中間件函數(shù),即使你不需要使用next對(duì)象,也必須指定它以維護(hù)簽名,否則,next對(duì)象將被解釋為常規(guī)中間件,并且將無(wú)法處理錯(cuò)誤。
以與其他中間件函數(shù)相同的方式定義錯(cuò)誤處理中間件函數(shù),除了四個(gè)參數(shù)而不是三個(gè),特別是簽名(err, req, res, next):
app.use(function (err, req, res, next) { console.error(err.stack) res.status(500).send("Something broke!") })
有關(guān)錯(cuò)誤處理中間件的詳細(xì)信息,請(qǐng)參閱:錯(cuò)誤處理。
內(nèi)置中間件從版本4.x開(kāi)始,Express不再依賴于Connect,之前包含在Express中的中間件函數(shù)現(xiàn)在位于不同的模塊中,查看中間件函數(shù)列表。
Express具有以下內(nèi)置中間件函數(shù):
express.static提供靜態(tài)資源,如HTML文件、圖像等。
express.json使用JSON的有效負(fù)載解析傳入的請(qǐng)求,注意:適用于Express 4.16.0+。
express.urlencoded使用URL編碼的有效負(fù)載解析傳入的請(qǐng)求,注意:適用于Express 4.16.0+。
第三方中間件使用第三方中間件為Express應(yīng)用程序添加功能。
安裝Node.js模塊以獲得所需的功能,然后在應(yīng)用程序級(jí)別或路由器級(jí)別將其加載到你的應(yīng)用程序中。
以下示例說(shuō)明了安裝和加載cookie解析中間件函數(shù)cookie-parser。
$ npm install cookie-parser
var express = require("express") var app = express() var cookieParser = require("cookie-parser") // load the cookie-parsing middleware app.use(cookieParser())
有關(guān)Express常用的第三方中間件函數(shù)的部分列表,請(qǐng)參閱:第三方中間件。
上一篇:編寫中間件 下一篇:使用模板引擎文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/100446.html
摘要:使用承諾和異步功能來(lái)擺脫回調(diào)地獄的應(yīng)用程序,并簡(jiǎn)化錯(cuò)誤處理。它暴露了自己的和對(duì)象,而不是的和對(duì)象。因此,可被視為的模塊的抽象,其中是的應(yīng)用程序框架。這使得中間件對(duì)于整個(gè)堆棧而言不僅僅是最終應(yīng)用程序代碼,而且更易于書(shū)寫,并更不容易出錯(cuò)。 Koa 與 Express 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進(jìn)或 Star 關(guān)注更新...
摘要:方法此中間件在及更高版本中可用。由于的形狀基于用戶控制的輸入,因此該對(duì)象中的所有屬性和值都是不可信的,應(yīng)該在信任之前進(jìn)行驗(yàn)證。注意為獲得最佳結(jié)果,請(qǐng)使用反向代理緩存來(lái)提高服務(wù)靜態(tài)資源的性能。 express() 創(chuàng)建一個(gè)Express應(yīng)用程序,express()函數(shù)是express模塊??導(dǎo)出的頂級(jí)函數(shù)。 var express = require(express); var app ...
摘要:常見(jiàn)問(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)參閱,了解以模型為中心的基于的框架。 常見(jiàn)問(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)中,路由和其他特定于...
摘要:編寫中間件中間件函數(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路...
摘要:要使用多個(gè)靜態(tài)資源目錄,請(qǐng)多次調(diào)用中間件函數(shù)按照使用中間件函數(shù)設(shè)置靜態(tài)目錄的順序查找文件。注意為獲得最佳結(jié)果,請(qǐng)使用反向代理緩存來(lái)提高服務(wù)靜態(tài)資源的性能。 靜態(tài)文件 要提供靜態(tài)文件(如images、CSS文件和JavaScript文件),請(qǐng)使用Express中的express.static內(nèi)置中間件功能,函數(shù)簽名是: express.static(root, [options]) ro...
閱讀 1164·2021-10-14 09:42
閱讀 1490·2021-09-22 15:11
閱讀 3393·2019-08-30 15:56
閱讀 1326·2019-08-30 15:55
閱讀 3692·2019-08-30 15:55
閱讀 942·2019-08-30 15:44
閱讀 2093·2019-08-29 17:17
閱讀 2138·2019-08-29 15:37