ExpressJS:我为什么要分离我的路线和处理它们的功能?

时间:2015-12-11 15:18:35

标签: node.js design-patterns express

我最近开始了一个Nodejs项目,我的道路看起来像这样:

router.get('/groups/', function(req, res) {
  GroupManager.getAllGroup(function(groups) {
    return res.json(groups);
  });
});

我看到很少有人将他们的路线和处理它们的功能分开的例子,导致类似:

GroupController.js

exports.module = {
    getAll : function(fn) {
        GroupManager.getAllGroup(function(groups) {
            fn(groups);
        }
    }
}

Routes.js

router.get('/groups/', function(req, res) {
  GroupController.getAll(function(groups) {
      return res.json(groups);
  });
});

我开始的项目增长速度非常快,所以拥有一个干净的代码库对我来说非常重要,但我很难找到这种分割代码的好处。

另外,我正在努力寻找一些有关expressJS下的代码组织的文档。我发现很多博客文章在讨论它,但没有什么能够成为权威,是否有一些着名的开源expressJs项目我可以用作灵感?

1 个答案:

答案 0 :(得分:1)

因此,理想情况下,您希望分离关注点,这可能不是显示该问题的示例,而是考虑以下因素。该路由应仅负责路由,而不是任何业务逻辑/操作,除了将任务交给功能(即控制器)。理想情况下,控制器应该执行业务逻辑,理想情况下模型应该只与数据库交互。

此时你的控制器没有做任何事情,只是简单地调用获取数据:

   GroupManager.getAllGroup(function(groups) {
        fn(groups);
    }

并将其传回去。但是,让我们考虑您希望组页面显示组的场景,以及与顶层用户交互的用户。或想要发送metrcis或对GroupManager.getAllGroup

的群组数据进行任何操作
   GroupManager.getAllGroup(function(groups) {
        UserManager.getPopularUsers(groups[0], function(users){
             var result = {
                groupId: groups[0].id
                groupName: groups[0].name
                groupPopularUser: user.popularUser
             }
         }

        //do other cimputations that may be needed, may send a metrcis data
     }

在你的例子中,实际上并不需要分离,但随着时间的推移它可以。当然,这对于你正在做的事情来说可能过于冗长,你需要决定是否提前构建额外的成本会在以后复杂性增加时节省时间。