所以我不太确定标题是否足够描述,但这里有一个超级简单的例子。
我的网站有一个公共区域和一个受限制的管理区域。
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 方式。例如:
-
在您的主应用程序中.js只需创建一个指向
/admin
的路由,如下所示:app.use('/admin', authMiddleWere, require('./src/your-route-to-the-file/admin.route'));
-
在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
是您的服务。
本质上,您将功能拆分为专用的router
、controller
和service
文件。因此,当您尝试访问路由/admin
时,它将在router
文件中查找任何后缀。
如果要访问/news
终结点,则 API 将仅进行一次调用。
如果这有帮助,我可以进一步扩展我的解释。