摘要:調(diào)用堆棧中的下一個中間件函數(shù)。此示例顯示了一個中間件子堆棧,它處理對路徑的請求。要從路由器中間件堆棧跳過其余的中間件函數(shù),請調(diào)用將控制權(quán)傳遞給下一個路由,注意僅適用于使用或函數(shù)加載的中間件函數(shù)。
使用中間件
Express是一個路由和中間件Web框架,其本身的功能非常小:Express應(yīng)用程序本質(zhì)上是一系列中間件函數(shù)調(diào)用。
中間件函數(shù)是可以訪問請求對象(req)、響應(yīng)對象(res)以及應(yīng)用程序請求—響應(yīng)周期中的下一個中間件函數(shù)的函數(shù),下一個中間件函數(shù)通常由名為next的變量表示。
中間件函數(shù)可以執(zhí)行以下任務(wù):
執(zhí)行任何代碼。
更改請求和響應(yīng)對象。
結(jié)束請求—響應(yīng)周期。
調(diào)用堆棧中的下一個中間件函數(shù)。
如果當(dāng)前的中間件函數(shù)沒有結(jié)束請求—響應(yīng)周期,它必須調(diào)用next()將控制權(quán)傳遞給下一個中間件函數(shù),否則,請求將被掛起。
Express應(yīng)用程序可以使用以下類型的中間件:
應(yīng)用程序級中間件
路由器級中間件
錯誤處理中間件
內(nèi)置中間件
第三方中間件
你可以使用可選的裝載路徑加載應(yīng)用程序級和路由器級中間件,你還可以將一系列中間件函數(shù)加載在一起,從而在裝載點創(chuàng)建中間件系統(tǒng)的子堆棧。
應(yīng)用程序級中間件使用app.use()和app.METHOD()函數(shù)將應(yīng)用程序級中間件綁定到app對象的實例,其中METHOD是中間件函數(shù)處理的請求的小寫HTTP方法(例如GET,PUT或POST)。
此示例顯示了沒有裝載路徑的中間件函數(shù),每次應(yīng)用程序收到請求時都會執(zhí)行該函數(shù)。
var app = express() app.use(function (req, res, next) { console.log("Time:", Date.now()) next() })
此示例顯示了安裝在/user/:id路徑上的中間件函數(shù),對/user/:id路徑上的任何類型的HTTP請求執(zhí)行該函數(shù)。
app.use("/user/:id", function (req, res, next) { console.log("Request Type:", req.method) next() })
此示例顯示了路由及其處理函數(shù)(中間件系統(tǒng)),該函數(shù)處理對/user/:id路徑的GET請求。
app.get("/user/:id", function (req, res, next) { res.send("USER") })
下面是一個使用掛載路徑在掛載點加載一系列中間件函數(shù)的示例,它說明了一個中間件子堆棧,它將任何類型的HTTP請求的請求信息打印到/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() })
路由處理程序使你可以為路徑定義多個路由,下面的示例為/user/:id路徑定義了兩個GET請求路由,第二個路由不會引起任何問題,但它永遠(yuǎn)不會被調(diào)用,因為第一個路由結(jié)束了請求—響應(yīng)周期。
此示例顯示了一個中間件子堆棧,它處理對/user/:id路徑的GET請求。
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) })
要從路由器中間件堆棧跳過其余的中間件函數(shù),請調(diào)用next("route")將控制權(quán)傳遞給下一個路由,注意:next("route")僅適用于使用app.METHOD()或router.METHOD()函數(shù)加載的中間件函數(shù)。
此示例顯示了一個中間件子堆棧,它處理對/user/:id路徑的GET請求。
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") })路由器級中間件
路由器級中間件的工作方式與應(yīng)用程序級中間件的工作方式相同,只是它綁定到express.Router()的實例。
var router = express.Router()
使用router.use()和router.METHOD()函數(shù)加載路由器級中間件。
以下示例代碼通過使用路由器級中間件復(fù)制上面顯示的應(yīng)用程序級中間件的中間件系統(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)
要跳過其余路由器中間件函數(shù),請調(diào)用next("router")將控制權(quán)交還出路由器實例。
此示例顯示了一個中間件子堆棧,它處理對/admin路徑的GET請求。
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) })錯誤處理中間件
錯誤處理中間件總是需要四個參數(shù),你必須提供四個參數(shù)以將其標(biāo)識為錯誤處理中間件函數(shù),即使你不需要使用next對象,也必須指定它以維護(hù)簽名,否則,next對象將被解釋為常規(guī)中間件,并且將無法處理錯誤。
以與其他中間件函數(shù)相同的方式定義錯誤處理中間件函數(shù),除了四個參數(shù)而不是三個,特別是簽名(err, req, res, next):
app.use(function (err, req, res, next) { console.error(err.stack) res.status(500).send("Something broke!") })
有關(guān)錯誤處理中間件的詳細(xì)信息,請參閱:錯誤處理。
內(nèi)置中間件從版本4.x開始,Express不再依賴于Connect,之前包含在Express中的中間件函數(shù)現(xiàn)在位于不同的模塊中,查看中間件函數(shù)列表。
Express具有以下內(nèi)置中間件函數(shù):
express.static提供靜態(tài)資源,如HTML文件、圖像等。
express.json使用JSON的有效負(fù)載解析傳入的請求,注意:適用于Express 4.16.0+。
express.urlencoded使用URL編碼的有效負(fù)載解析傳入的請求,注意:適用于Express 4.16.0+。
第三方中間件使用第三方中間件為Express應(yīng)用程序添加功能。
安裝Node.js模塊以獲得所需的功能,然后在應(yīng)用程序級別或路由器級別將其加載到你的應(yīng)用程序中。
以下示例說明了安裝和加載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ù)的部分列表,請參閱:第三方中間件。
上一篇:編寫中間件 下一篇:使用模板引擎文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/100446.html
摘要:使用承諾和異步功能來擺脫回調(diào)地獄的應(yīng)用程序,并簡化錯誤處理。它暴露了自己的和對象,而不是的和對象。因此,可被視為的模塊的抽象,其中是的應(yīng)用程序框架。這使得中間件對于整個堆棧而言不僅僅是最終應(yīng)用程序代碼,而且更易于書寫,并更不容易出錯。 Koa 與 Express 此系列文章的應(yīng)用示例已發(fā)布于 GitHub: koa-docs-Zh-CN. 可以 Fork 幫助改進(jìn)或 Star 關(guān)注更新...
摘要:方法此中間件在及更高版本中可用。由于的形狀基于用戶控制的輸入,因此該對象中的所有屬性和值都是不可信的,應(yīng)該在信任之前進(jìn)行驗證。注意為獲得最佳結(jié)果,請使用反向代理緩存來提高服務(wù)靜態(tài)資源的性能。 express() 創(chuàng)建一個Express應(yīng)用程序,express()函數(shù)是express模塊??導(dǎo)出的頂級函數(shù)。 var express = require(express); var app ...
摘要:常見問題我該如何構(gòu)建我的應(yīng)用程序這個問題沒有明確的答案,答案取決于你的應(yīng)用程序規(guī)模和所涉及的團(tuán)隊,為了盡可能靈活,在結(jié)構(gòu)方面沒有做出任何假設(shè)。請參閱,了解以模型為中心的基于的框架。 常見問題 我該如何構(gòu)建我的應(yīng)用程序? 這個問題沒有明確的答案,答案取決于你的應(yīng)用程序規(guī)模和所涉及的團(tuán)隊,為了盡可能靈活,Express在結(jié)構(gòu)方面沒有做出任何假設(shè)。 在你喜歡的任何目錄結(jié)構(gòu)中,路由和其他特定于...
摘要:編寫中間件中間件函數(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路...
摘要:要使用多個靜態(tài)資源目錄,請多次調(diào)用中間件函數(shù)按照使用中間件函數(shù)設(shè)置靜態(tài)目錄的順序查找文件。注意為獲得最佳結(jié)果,請使用反向代理緩存來提高服務(wù)靜態(tài)資源的性能。 靜態(tài)文件 要提供靜態(tài)文件(如images、CSS文件和JavaScript文件),請使用Express中的express.static內(nèi)置中間件功能,函數(shù)簽名是: express.static(root, [options]) ro...
閱讀 1085·2021-10-14 09:42
閱讀 1381·2021-09-22 15:11
閱讀 3293·2019-08-30 15:56
閱讀 1251·2019-08-30 15:55
閱讀 3620·2019-08-30 15:55
閱讀 896·2019-08-30 15:44
閱讀 2032·2019-08-29 17:17
閱讀 2079·2019-08-29 15:37