我正在创建一个nodejs(express)应用程序的新结构。
我有一个带有mongoose架构的模型文件夹,一个路由路由文件夹,一个控制器文件夹(包含所有逻辑)和主文件 server.js ,其中包含:
require('./models/notifications');
require('./models/articles');
const
notificationRouter = require('./routes/notifications'),
articleRouter = require('./routes/articles');
app.use('/notifications', notificationRouter);
app.use('/articles', articleRouter);
文件 routes / notifications.js
const
router = require('express').Router(),
controller = require('../controllers/notifications');
router.route('/')
.get(controller.getAll)
.post(controller.create);
router.route('/:id')
.put(controller.seen);
module.exports = router;
档案 routes / articles.js
const
router = require('express').Router(),
controller = require('../controllers/articles');
router.route('/:articleId/comments')
.post(controller.insertComment);
module.exports = router;
我还有一个中间件功能,可以确保仅为登录的用户访问。我的问题是,我应该在哪里放置中间件以使其尽可能干净?我担心的是:
感谢所有人以及对我的清洁解决方案的任何建议或批评。
答案 0 :(得分:0)
我还有一个中间件功能,可以确保仅为登录的用户访问。我的问题是,我应该在哪里放置中间件以使其尽可能干净?
最简单的方案是定义不需要身份验证的少数路由,然后,您将为您的身份验证中间件执行app.use()
,因为它将应用于您之后定义的所有路由。
但文章路线的种类更多,例如每个人都可以看到文章,但只是登录用户可以评论它。所以我必须在路由文件中包含中间件。
如果您的路由器在某些路由上需要auth而在路由器中没有其他路由器,那么您创建的设计不允许以最简单的方式检查身份验证。为了实现这一目标,您必须使用router.use()
向具有需要身份验证的路由的路由器添加身份验证。同样,您首先定义不需要auth的路由,然后使用您的auth中间件执行router.use()
,然后定义需要auth的路由。
在许多路由文件中,我是否真的需要相同的需求功能(只有一个中间件)?
这取决于你的设计。如果您的设计要求您将auth中间件添加到每个路由器,那么您将需要在该中间件中为每个路由器文件要求。但是,如果您设计路由器以使路由器不混合使用auth和非auth路由,那么您可以先通过定义非auth路由器来处理更高级别的auth中间件,然后添加您的auth中间件使用app.use()
然后定义需要身份验证的路由器。处理身份验证的复杂性完全取决于您如何组织需要身份验证的路由。如果你将它们与不需要auth的路由混合在一起,那么代码肯定会更加详细,以便适当地定义autn。如果将auth与非auth路由分开,则可以在更高级别添加auth中间件,也许只需添加一次。
这是使用全局功能(中间件)的好地方吗?
没有。将一个require()
语句添加到模块顶部以便在需要时获取中间件并没有什么大不了的,然后就可以避免使用全局变量。
以前已经讨论了避免在许多模块的顶部使用require()
的一般问题。以下是其中一些参考文献:
How to properly require files into another file
NodeJS require all modules in one file, good practice?
How to make module (such as bcrypt) available globally in Express?