在Express中创建MVC模式,并用controllers文件夹替换routes文件夹

时间:2018-06-11 09:03:20

标签: javascript node.js express model-view-controller

Express的新功能。想在Express中实现MVC模式,并用控制器文件夹替换routes文件夹。我发现这个代码实际上有效,但我不太了解它的作用:

var fs = require('file-system');    

fs.readdirSync('controllers').forEach(function (file) {
      if(file.substr(-3) == '.js') {
        const route = require('./controllers/' + file);
        route.controller(app);
      }
    })

readdirSync读取文件夹' controller'的内容。对于每个文件,它发现它做了一些我不明白的事情:

if(file.substr(-3)==' .js') //检查文件的结尾是否为.js但是为什么?

const route = require(' ./ controllers /' + file); //不明白这个

route.controller(app); //不明白这个

你能帮忙解决这个问题吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

您关注的示例来自Tim Roberts的this blog entry。示例控制器演示了它的全部内容:

var mongoose = require('mongoose')
var Video = require('../models/user');

module.exports.controller = function(app) {

  app.get('/signup', function(req, res) {
      // any logic goes here
      res.render('users/signup')
  });

  app.get('/login', function(req, res) {
      // any logic goes here
      res.render('users/login')
  });
}

如果将此示例控制器保存在controllers下的whatever.js文件夹中,则会导出一个函数controller,该函数将快速应用程序作为参数并添加一对自定义路线到应用程序。

然后,主模块扫描controllers文件夹下的所有此类文件,并首先使用require函数加载模块:

const route = require('./controllers/' + file); 

在上面的行之后,route包含对包含此controller函数的模块的引用。

route.controller(app); 

只调用从模块导出的函数,将全局app作为参数传递。

这样,您只需在.js文件夹下创建单独的controllers模块即可轻松扩展您的应用,这些模块遵循相同的约定(导出controller功能)。