2015-02-06 30 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); 
     }); 
    } 
} 

所以現在的模型返回查詢控制器的要求,給予控制器能夠將數據傳遞給視圖。