使用express,我有多个路由需要一些中间件。它们不在任何共同的/url/path
之下。
路由器级中间件说:
路由器级中间件的工作方式与应用程序级中间件相同,只是它绑定到express的实例。路由器()
当我读到它时,这意味着中间件只适用于路由器实例的路由。但事实似乎并非如此。
在下面的例子中;被称为"路由器"的路由器;仅针对CCD_ 2进行记录。
但它也被记录为http://localhost:10000/noRouter
,我不明白。为什么router
实例的中间件use
d会被直接添加到app
的路由调用?是否可以创建一个Router
,以便只有绑定到该Router
的路由才能应用中间件?
const express = require('express')
const app = express()
const port = 10000
const router = express.Router();
router.use((req, _res, next) => {
console.log("router called")
next()
})
app.use(router)
router.get('/router', (req, res) => {
res.send("ok")
})
app.get('/noRouter', (req, res) => {
res.send("ok")
})
app.listen(port, () => {
console.log(`Listening at http://localhost:${port}`)
})
第页。S.:我没有陷入困境,而是用不同的方法让它发挥作用。我只是想明白为什么这不起作用。。。
路由器只是插入到一个请求处理程序链中,并按顺序进行搜索/执行。
因为你这样做:
app.use(router)
您专门将所有请求发送到您的路由器。因此,所有请求都将通过路由器中的各种处理程序,寻找与传入路径匹配的处理程序。这将包括与所有路径匹配的router.use()
中间件,因此它将对发送到路由器的每个URL执行。路由器中没有任何逻辑在执行任何中间件之前首先检查路由器中的某个路由是否匹配。在这方面,路由器的工作方式与app
对象类似,并按照遇到中间件的顺序执行中间件。因此,如果请求根本没有到达路由器,那么中间件就无法执行。
如果您希望中间件只应用于路由器中的路由,那么您有两个选择:
将路由器放在通用路径前缀上,例如:
app.use("/somerouterprefix", router);
然后,只有路由到路由器的URL才会在路由器中运行中间件。当然,这只会为以该前缀开头的路由执行中间件,但也会为以前缀开头的路由器执行中间件,但是路由器中甚至没有匹配的路由处理程序。请记住,我之前说过,发送到路由器的所有内容都会导致您的中间件执行。
或者,第二,将中间件放在路由器中的每个单独的处理程序上,这样它只有在与路由器上的某些路由匹配时才能执行,例如:
const router = express.Router();
// give the middleware a function name so you can
// use it in specific route definitions
function myMiddleware((req, _res, next) => {
console.log("router called")
next()
});
// specify the middleware in your route definition
router.get('/router', myMiddleware, (req, res) => {
res.send("ok")
});