快速路由 - 防止 app.use('/') 顶级路径中间件在直接访问子/嵌套路径时执行



所以我不太确定标题是否足够描述,但这里有一个超级简单的例子。

我的网站有一个公共区域和一个受限制的管理区域。

example.com/admin(管理员主页(
example.com/admin/news(新闻页面(
example.com/admin/posts(帖子页面(

而且因为我不希望不是管理员或登录的人能够访问它,所以我有一个简单的中间件功能来检查cookie。

应用.js

const express = require('express');
const app = express();
const authMiddleWere = async (req, res, next) => {
// pseudo-code, do some cookie validity check here
console.log(`Route: ${req.url}`)
if (cookie) {
next();
}
};
const adminRouter = require('./routes/private/home');
const newsRouter = require('./routes/private/news');
const postsRouter = require('./routes/private/posts');
app.use('/admin/', authMiddleWere, adminRouter);
app.use('/admin/news', authMiddleWere, newsRouter);
app.use('/admin/posts', authMiddleWere, postsRouter);

/路线/私人/家庭.js

const express = require('express');
const router = express.Router();
router.get('/', async (req, res, err) => {
res.render('private/home');
});
module.exports = router;

这里的问题是,当我访问嵌套路径(例如共享相同模式的example.com/admin/news(时,这个authMiddleWere函数被调用了两次 - 它以/admin/.....开头。

我可以肯定地说,因为我们正在中间件函数中记录req.url,所以如果我转到example.com/admin它会注销:

Route: /

但是如果我去example.com/admin/news它会注销两者:


Route: /Route: /news

那么是什么原因造成的,我该如何解决它?我假设我描述的是 Express 的预期行为.js所以我正在寻找一种方法来解决这个问题或更好地(重新(构建我的代码。

干杯!

您可以为路由使用正则表达式。

app.use(//admin$/, authMiddlewear, authRouter);

这将仅匹配以admin结尾的路由。 您可能需要处理路由/admin/而不是/admin的情况,但 iirc,表达式会智能地处理它。

解决此问题的一种方法是创建一个单独的route文件并将所有内容拆分为 MVC 方式。例如:

  1. 在您的主应用程序中.js只需创建一个指向/admin的路由,如下所示:

    app.use('/admin', authMiddleWere, require('./src/your-route-to-the-file/admin.route'));

  2. admin.route文件中,像这样调用控制器

    const express = require("express");
    const router = express.Router();
    const mainAdminCtrl = require("../controllers/admin.controller");
    router.get("/news", mainAdminCtrl.adminAuthDisplay);
    module.exports = router;
    

其中const mainAdminCtrl是您的控制器,功能adminAuthDisplay是您的服务。

本质上,您将功能拆分为专用的routercontrollerservice文件。因此,当您尝试访问路由/admin时,它将在router文件中查找任何后缀。

如果要访问/news终结点,则 API 将仅进行一次调用。

如果这有帮助,我可以进一步扩展我的解释。

最新更新