我有以下帶有 3 個獨立路由器的代碼
const Express = require("express")
const app = Express()
const usersRouter = Express.Router()
const productsRouter = Express.Router()
const storeRouter = Express.Router()
productsRouter.use((_, res, next) => {
res.send("products fail")
//next()
})
storeRouter.use((_, res, next) => {
res.send("store fail")
//next()
})
usersRouter.route("/users")
.get((_, res) => res.send("users"))
productsRouter.route("/products")
.get((_, res) => res.send("products"))
storeRouter.route("/store")
.get((_, res) => res.send("store"))
app.use(usersRouter)
app.use(productsRouter)
app.use(storeRouter)
app.listen(80, () => console.log("running"))
但是每次我請求/store路由時,它都會通過productRouter僅分配給它的中間件。
我無法理解這種行為。
為什么是這樣?如何管理每個中間件的獨立中間件?
GET /store 200
products fail
預期的
GET /store 200
store fail
uj5u.com熱心網友回復:
當你這樣做時:
app.use(productsRouter)
它將所有請求發送到productsRouter,因此它的中間件針對所有請求運行。所以,當你有這個時:
productsRouter.use((_, res, next) => {
res.send("products fail")
//next()
});
這將在每個請求上運行。
如果您希望路由器僅查看某些請求,則將路由器注冊到路徑上,以便路由器僅獲取發往特定路徑的請求。
app.use("/products", productsRouter)
并且,然后從路由器的路由中洗掉路徑本身,因為該路徑已經被過濾。
uj5u.com熱心網友回復:
為了實作預期的行為,您必須對代碼進行少量更改。
第一: 采用這種方法,因為它可以讓你保持一切干凈和分離(如果你想為每條路由實作特定的中間件,這一點至關重要)。
usersRouter.
.get("/", (req, res) => res.send("users"))
productsRouter.route
.get("/", (req, res) => res.send("products"))
storeRouter.route("/store")
.get("/", (req, res) => res.send("store"))
app.use("/users", usersRouter)
app.use("/products", productsRouter)
app.use("/store", storeRouter)
而不是這個
usersRouter.route("/users")
.get((_, res) => res.send("users"))
productsRouter.route("/products")
.get((_, res) => res.send("products"))
storeRouter.route("/store")
.get((_, res) => res.send("store"))
app.use(usersRouter)
app.use(productsRouter)
app.use(storeRouter)
第二:
取消next()對中間件的呼叫的注釋,在它們的回呼中識別請求引數并將它們存盤在變數中(不是關鍵,但提高了可讀性)
const productsMiddleware = (req, res, next) => {
res.send("products fail")
next()
}
const storeMiddleware = (res, res, next) => {
res.send("store fail")
next()
}
第三: 在路由之后和路由器上的實際控制器宣告之前將要應用的中間件傳遞給特定控制器。例如
usersRouter.
.get("/", (req, res) => res.send("users"))
productsRouter.route
.get("/", productsMiddleware, (req, res) => res.send("products"))
storeRouter.route("/store")
.get("/", storeMiddleware, (req, res) => res.send("store"))
通過執行所有這些操作,您最終將獲得僅適用于指定路由/控制器的“獨立中間件”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/422747.html
標籤:
