2012-07-25 28 views
2

我想意見/建議是否這是一個很好的方式來實現/增強MVC模式與Node.js和Express.js這是一個與MVC模式和Express.js一起工作的好方法嗎?

1)我正常初始化應用程序,但在這個階段,我打電話給函數I命名routeRegistrar,如下所示:

var 
    express = require('express'), 
    routeRegistrar = require('./routeRegistrar'), 

var app = express.createServer(); 

configureApp(app); 
routeRegistrar(app); //note this line 

app.listen(3000, function(){ 
    console.log("App started"); 
}); 

function configureApp(app){ 
    app.configure(function(){ 
     //configuration stuff with app variable 
    }); 
} 

2)I採用每個控制器將被放置在稱爲Controllers目錄中的慣例,並且每一個控制器由包含一個或多個動作的模塊構成時,推到exports變量作爲遵循上述約定的對象:

{ method: 'GET', url: '/example', action: function(req, res){ } } 

所以這樣我可以自動化路由註冊過程,並保持方法/ url接近處理請求的代碼(我認爲它更易於閱讀/維護)。所以對於routeRegistrar的代碼如下:

var fs = require('fs'); 

module.exports = function(app){ 
    fs.readdirSync(__dirname + '/controllers').forEach(function(controllerName){ 
     var controller = require("./controllers/" + controllerName); 

     for (var actionName in controller) { 
      var action = controller[actionName]; 
      app[action.method](action.url, action.action); 
     } 
    }); 
} 

和簡便的一種indexController的是這樣的:

exports.index = { 
    url: "/", 
    method: "get", 
    action: function(req, res){ 
     res.render('index'); 
    } 
} 

恕我直言,我相信這是每一個我想要的時間提供更好的辦法了新的控制器/路線註冊我不得不

1-開放app.js 2-發生在頂部 另一個需要線等app.get('/index', indexController.index);

-寫入代碼

請讓我知道這是繼續項目的好方法,我想聽聽您的意見和建議。

編輯: 基於Tyrsius答案,缺乏其他的意見,我會使用他的方法與一些修改:

routeRegistrar.js

var fs = require('fs'); 

module.exports = function(app){ 
fs.readdirSync(__dirname + '/controllers').forEach(function(controllerName){ 
    var controller = require("./controllers/" + controllerName); 

    for (var actionName in controller) { 
      controller[actionName](app); 
     } 
    }); 
}; 

indexController.js

module.exports.index = function(app){ 
    app.get("/", function(req, res){ 
     res.send("New approach!"); 
    }); 
}; 
+1

如果我是我看看[表達資源(https://github.com/visionmedia/express-resource/)在你的鞋子 - 這是一個很好的承擔,國際海事組織。但是,我沒有在你的設計中發現任​​何錯誤。編輯:剛纔看到你的編輯。我自己我喜歡明確列舉我的路線。但這是一個品味問題。儘管您也可以自動加載快速資源模塊。 – 2012-07-25 16:27:29

回答

4

這不是一個糟糕的解決方案,但我認爲制定自己的路線語法會令人困惑。能夠使用Node/Express所用的相同路由語法將從長遠角度幫助您。當你去一個新的項目時,你不會對它不熟悉,因爲你將會使用其他人的語法,所以你將能夠尋求幫助。

我使用類似的解決方案,它看起來像這樣。它會在啓動時抓取/routes目錄中的每個.js文件,因此您可以添加控制器而無需更改任何代碼。

在app.js

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

路由/索引。JS

var fs = require('fs'); 

module.exports = function(app){ 

    //GET home page 
    app.get('/', function(req, res){   
     res.render('index'); 
    }); 

    //Load other controllers/routes 
    fs.readdirSync(__dirname).forEach(function(file) { 
     if (file == "index.js") return; 
     //var name = file.substr(0, file.indexOf('.')); 
     require(__dirname + '/' + file)(app); 
    }); 
}; 

示例路線/控制器:

module.exports = function(app){ 

    app.post('/login', function(req, res){ 
     //stuff 
    }); 

    //other actions on this route 
}; 
+0

這是一個很好的消化@Tyrsius,你的消化與我所用的方法非常相似。謝謝! +1 – renatoargh 2012-07-25 19:33:12

相關問題