快速路由器旁路

WOR*_*MSS 5 routing routes node.js express

在快速服务器中,我使用用户根据权限显示不同的内容。

app.use("/user", ensureAdmin, ...myAdminFunc);
app.use("/user", ...myFunc);
Run Code Online (Sandbox Code Playgroud)

现在,在我的真实代码中,我已将其分解为自己的 Express.Router 对象。并做了app.use(adminRoutes);

目前所有简单的东西。我发现该next("route")功能没有按我预期的方式工作。从那以后,我读到我仍然需要ensureAdmin在路由器内的每条路由上使用中间件功能。

我目前有以下。

function ensureAdmin(req, res, next) {
    /*if not admin*/ next("route");
}
admin.get("/user", ensureAdmin, ...myAdminFunc);
admin.get("/other", ensureAdmin, ...myOtherAdminFunc);
Run Code Online (Sandbox Code Playgroud)

我希望我可以做一个中间件并在需要时绕过整个路由器。诸如此类的东西

function ensureAdmin(req, res, next) {
    /*if not admin*/ next("skip everything in this router");
}
admin = new Express.Router();
admin.use(ensureAdmin);
admin.get("/user", ...myAdminFunc);
admin.get("/other", ...myOtherAdminFunc);
Run Code Online (Sandbox Code Playgroud)

但是当我next("route")在 ensureAdmin 内打电话时,它仍然继续进行admin.get("/user", ...myAdminFunc);

我已经读到这预期的行为next("route")

但是想知道是否有一种我还没有找到的方法可以绕过这个管理路由器集合中的所有内容?也许是next("router")什么?

我知道路由器本身不算作“路由”,而是一个路由集合,这现在是有道理的,为什么next("route")不起作用。

  • 科林

Jac*_*ers 1

该功能于 2017 年在THIS commit下实现,请参阅route.js 的第 121 行

用法如下

const express = require('express')
const app = express()

function myAwesomeCheck() {
    // randomly pick a router to go with
    return (Math.random() > 0.5) 
}

const router1 = express.Router()

router1.use((req, res, next) => {
    // using next('router') will skip this entire router and pass to router2
    if(myAwesomeCheck() === true) next('router')
    // using next() will just pass to the middleware
    else next()
})

router1.get('/', (req, res) => {
    res.send("I'm router 1, this means myAwesomeCheck was FALSE")
})

const router2 = express.Router()

router2.get('/', (req, res) => {
    res.send("I'm router 2, this means myAwesomeCheck was TRUE")
})

app.use(router1, router2)
app.listen(3000)

Run Code Online (Sandbox Code Playgroud)

这允许您在不满足条件时完全跳过路由器,在示例情况下,它将在 50% 的情况下随机跳过 router1