これがNode.jsとExpress.jsでMVCパターンを実装/強化するための良い方法であるかどうかについて意見/提案をしたいと思います
1)通常どおりアプリを初期化しますが、この段階で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)すべてのコントローラーは、というディレクトリに配置され、Controllers
すべてのコントローラーは1つ以上のアクションを含むモジュールで構成され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');
}
}
IMHOこれは、新しいコントローラー/ルートを登録する必要があるたびに、より良いアプローチだと思います。
1-app.jsを開きます2-上部に別のrequire行を配置します3-次のようなコードを記述しますapp.get('/index', indexController.index);
これがプロジェクトを継続するための良い方法であるかどうかを教えてください。あなたの意見や提案を聞きたいと思います。
編集: ティルシウスの答えと別の意見の欠如に基づいて、私はいくつかの修正を加えて彼のアプローチを使用します:
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!");
});
};