2012-10-17 5 views
8

Czy istnieje coś, co jest inne lub mocniejsze dzięki tradycyjnemu kontrolerowi na trasie ekspresowej?Jaka jest różnica między trasą express.js a sterownikiem?

Jeśli masz aplikację ekspresową i definiujesz modele, czy staje się ona aplikacją MVC, czy jest bardziej potrzebna?

Zastanawiam się, czy brakuje mi dodatkowej/łatwiejszej funkcjonalności w moich aplikacjach ekspresowych węzła, nie przechodząc na bardziej uzasadniony "kontroler". Jeśli coś takiego istnieje.

Dzięki!

Edycja: W celu wyjaśnienia, jeśli używasz trasy tak:

// routes/index.js 
exports.module = function(req, res) { 
    // Get info from models here, 
    res.render('view', info: models); 
} 

co sprawia, że ​​każdy różni się od kontrolera? Czy kontroler jest w stanie zrobić więcej?

Odpowiedz

10

Przede wszystkim trasa w ekspresie to oprogramowanie pośrednie zdefiniowane w connect. Różnica między ramkami ekspresowymi i innymi polega na tym, że oprogramowanie pośrednie zwykle znajduje się przed kontrolerem, a kontroler kończy reakcję. Innym powodem, dla którego ekspresowe używa oprogramowania pośredniego, jest natura asynchroniczna Node.js.

Pozwala zobaczyć, jak kontroler może wyglądać w JavaScript.

var Controller = function() { }; 

Controller.prototype.get = function (req, res) { 

    find(req.param.id, function (product) { 

    res.locals.product = product; 

    find(res.session.user, function (user) { 

     res.locals.user = user; 
     res.render('product'); 

    }); 

    }); 

}; 

Pierwszą rzeczą, którą prawdopodobnie zauważasz na temat tego działania get, są zagnieżdżone wywołania zwrotne. Jest to trudne do przetestowania, trudne do odczytania i jeśli musisz edytować rzeczy, które musisz skrzypnąć z wcięciem. Więc pozwala to naprawić za pomocą kontroli przepływu i uczynić ją płaską.

var Controller = function() { }; 

Controller.prototype.update = function (req, res) { 

    var stack = [ 

    function (callback) { 

     find(req.param.id, function (product) { 
     res.locals.product = product; 
     callback(); 
     }); 


    }, 

    function (callback) { 

     find(res.session.user, function (user) { 
     res.locals.user = user; 
     callback(); 
     }); 

    } 

    ]; 

    control_flow(stack, function (err, result) { 
    res.render('product'); 
    }); 

} 

W tym przykładzie można wyodrębnić wszystkie różne funkcje stosu i przetestować je lub nawet ponownie wykorzystać je do różnych trasach. Być może zauważyłeś, że struktura przepływu sterowania wygląda podobnie do warstwy pośredniej. Więc zamień stos z oprogramowaniem pośredniczącym na naszej trasie.

app.get('/', 

    function (req, res, next) { 

    find(req.param.id, function (product) { 
     res.locals.product = product; 
     next(); 
    }); 

    }, 

    function (req, res, next) { 

    find(res.session.user, function (user) { 
     res.locals.user = user; 
     next(); 
    }); 

    }, 

    function (req, res, next) { 
    res.render('product'); 
    } 

); 

Tak więc może to być technicznie możliwe, aby kontrolery w express.js byś prawdopodobnie zmuszony do użycia struktur sterowania przepływem, który w końcu jest taka sama jak middleware.