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