【问题标题】:NodeJS and Express - separate my controllers and modelsNodeJS 和 Express - 分离我的控制器和模型
【发布时间】:2013-11-27 10:22:30
【问题描述】:

我正在构建我的第一个 Express 应用。这有点乱,因为我的控制器和模型都在同一个地方:app.js 文件。 有没有办法可以将它们分开? 甚至人为地,通过创建不同的文件,然后使用一些第三方程序将它们编译成 app.js 文件。

【问题讨论】:

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


    【解决方案1】:

    首先,您需要创建控制器和模型文件夹。

    您可以使用一个名为 express-load 的模块,该模块可用于自动加载模型、路由、模式、配置、控制器、对象映射...等...

    在你的主文件中,我的名为 app.js 你在启动服务器代码行之前加载它们..它应该看起来像

    //requires....
    var load = require('express-load');
    
    //your code 
    
    load('models')
    .then('controllers')
    .then('routes')
    .into(app);
    
    http.createServer(app).listen(app.get('port'), function(){
        console.log("Express listening on port "+ app.get('port'));
    });
    
    module.exports = app;
    

    然后,您的视图文件夹可以创建文件夹以保持您的代码井井有条,然后是子文件夹,我创建了一个名为 home 的文件夹,并在其中创建了我的 index 视图。

    在我的控制器文件夹中,我创建了一个名为 home.js 的 js 文件,它将查找我的索引视图:

    module.exports = function(app){
    
        var HomeController = {
            index: function(req, res){
                res.render('home/index');
            }
        };
        return HomeController;
    }
    

    最后在你的路由文件夹中,你可以设置你的应用程序路由,每个视图都需要在你的控制器中指定。我的路由文件名为 home.js

    module.exports = function(app){
        var home = app.controllers.home;
    
        app.get('/', home.index);
    }
    

    【讨论】:

      【解决方案2】:
      【解决方案3】:
      【解决方案4】:

      有没有办法可以将它们分开?

      是的,你应该把它们分开。

      大多数人所做的是在 app.js 主文件中声明路由并为控制器包含单独的文件(就像 Rituparna 所描述的那样)。

      这些控制器文件很可能会通过要求包含您的模型文件。例如。

      在 app.js 中

      var blogRoutes = require('./routes/blogRoutes');
      app.get('/api/blog/all', blogRoutes.all);
      

      在路由\blogRoutes.js

      var model = require('../models/blogModel');
      var all = function(req, res) {
      
         // your controller logic
         // and very likely calls to your model
         var m = model.blog(whatever);
         res.send(m.something());
      };
      
      module.exports = {
        all: all
      }
      

      在模型\blogModel.js

      var something = function() {
          return "something";
      };
      
      module.exports = {
        something: something
      }
      

      你可以在这个 repo https://github.com/hectorcorrea/hectorcorrea.com 中看到它的工作版本

      【讨论】:

      • 我已经看到express generator 在 app.js 中生成类似app.use('/users', users); 的东西。而在users.js中:var express = require('express'); var router = express.Router(); router.get('/', function(req, res, next) {...}); module.exports = router; 哪个更好?这两种方法的优缺点是什么?
      【解决方案5】:

      我通常做的是编写一个包含所有路由定义的模块并将其加载到app.js 例如

      require('./routes')(app);
      

      我的./routes.js 一般是这样的

      module.exports = function (app) {
      
              log.info('Loading express routes...');
      
              /* registration */
              app.post('/users', require('./routes/register-users'));    // register user
              app.post('/agents', require('./routes/register-agents'));    // register agents
      };
      

      我将所有路由 (.js) 文件保存在一个目录调用 routes

      希望它是您正在寻找的。

      【讨论】:

      猜你喜欢
      • 2015-08-18
      • 2014-09-13
      • 2011-03-06
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      相关资源
      最近更新 更多