2

これが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!");
    });
};
4

1 に答える 1

4

これは悪い解決策ではありませんが、ルートの独自の構文を作成すると混乱を招くと思います。Node/Express で使用されているものと同じルート構文を使用できると、長期的には役立ちます。新しいプロジェクトに行くときに慣れないことはありません。また、他の人が使用する構文を使用するため、助けを求めることができます。

私は同様のソリューションを使用しています。これは次のようになります。起動時にディレクトリ内のすべての .js ファイルを取得する/routesため、コードを変更することなくコントローラーを追加できます。

app.js で

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

ルート/index.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
};
于 2012-07-25T16:30:36.157 に答える