跨文件的中间件

时间:2018-05-12 17:31:00

标签: node.js express architecture routing

我正在创建一个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;

我还有一个中间件功能,可以确保仅为登录的用户访问。我的问题是,我应该在哪里放置中间件以使其尽可能干净?我担心的是:

  • 在不同的地方需要中间件
    • 通知路由仅适用于已登录的用户,因此可能位于 app.use()功能
    • 中的 server.js
    • 但文章路线的种类更多,例如每个人都可以看到文章,但只是登录用户可以评论它。所以我必须在路由文件中包含中间件。
  • 这是使用全局功能(中间件)的好地方吗?
  • 我真的需要在许多路由文件中使用相同的需求功能(只有一个中间件)吗?

感谢所有人以及对我的清洁解决方案的任何建议或批评。

1 个答案:

答案 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()的一般问题。以下是其中一些参考文献:

Node.js global 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?