2015-02-06 73 views
1

express.js为您提供了一个体面的准系统,以实现标准的MVC开发模式。然而,我所见过的大多数教程都是在路径文件或全局应用程序文件中应用控制器逻辑。使用Express.JS的基本MVC原理

在一个理想的世界:

模式 - 管理的基本行为和数据

控制器 - 将命令发送到模型和视图

查看 - 从渲染数据型号


目前我有以下:

路由/ index.js - 路由指向一个动作

router.get('/hotels', function(req, res, next) { 
    hotels.run(req, res, next); 
    next(); 
}); 

控制器/ hotels.js - 控制器发送命令到一个模型

module.exports = { 
    run: function(req, res, next) { 
     var users = new require('../models/hotels'); 
     users.run(function(callback) { 
      res.render('hotels', { title: 'Hotels page', users: callback }); 
     }); 
    } 
} 

models/hotel.js - 请求数据的模型

module.exports = { 
    run: function(callback) { 
     connection.query(sql, function(err, rows, fields) { 
      callback(rows); 
      //console.log(rows); 
     }); 
    } 
} 

无论我尝试什么,我都无法从模型中获取数据以返回控制器,然后传递给视图。我明白上面代码中可能存在多个错误,因为我是新来表达的。但基本原则应该没问题,我希望这是明显的,为什么我不能返回模型数据,因为除回调之外的所有逻辑都可以工作。

+0

在你的路由中,你打开执行'next'的两次可能性,因为你将它传递给控制器​​,然后在下面一行执行它。做一个或另一个,而不是两个。我也会简化你的路由到'router.get('/ hotels',hotels.run)' – 2015-02-06 17:40:00

+0

感谢提示@KevinB将修改 – gardni 2015-02-09 10:03:10

回答

0

我相信我已经解决了这个问题,如果人们希望在express.js项目中使用类似的MVC方法。

routes.js - 更改为与Kevin的清洁方法相匹配。

router.get('/hotels', hotels.run); 

控制器/ hotels.js -

module.exports = { 
    run: function(req, res, next) { 
     var users = new require('../models/hotels'); 
     users.run(function(err, callback) { 
      res.render('hotels', { title: 'Hotels page', users: callback }); 
     }); 
    } 
} 

型号/ hotel.js

module.exports = { 
    run: function(callback) { 
     connection.query(sql, function(err, rows, fields) { 
      callback(err, rows); 
     }); 
    } 
} 

所以现在的模型返回查询控制器的要求,给予控制器能够将数据传递给视图。