2012-10-17 8 views
8

Esiste qualcosa di diverso o più potente con un controller tradizionale su un percorso espresso?Qual è la differenza tra una route express node.js e un controller?

Se si dispone di un'app express e si definiscono modelli, diventa un'applicazione MVC o è necessario altro?

Mi chiedo se mi manca una funzionalità extra/più semplice nelle mie app express per nodo, non aggiornando a un "controllore" più legittimo. Se c'è una cosa del genere.

Grazie!

Edit: Per chiarire, se si utilizza un percorso in questo modo:

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

Che cosa lo rende diverso da un controller? Un controller è in grado di fare di più?

risposta

10

Prima di tutto un percorso in espresso è il middleware come definito in connect. La differenza tra Express e altri framework è che il middleware si trova principalmente di fronte al controller e il controller termina la risposta. Un altro motivo per cui express utilizza il middleware è dovuto alla natura di Node.js asincrona.

Consente di visualizzare l'aspetto di un controller in 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'); 

    }); 

    }); 

}; 

La prima cosa che probabilmente nota su questa azione è ottenere i callback nidificate. È difficile da testare, difficile da leggere e se hai bisogno di modificare i contenuti devi armeggiare con il tuo rientro. Quindi cerchiamo di risolvere questo problema utilizzando il controllo di flusso e rendilo piatto.

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'); 
    }); 

} 

In questo esempio è possibile estrarre tutte le diverse funzioni dello stack e testarli o anche loro riutilizzo per diversi itinerari. Avrai notato che la struttura del flusso di controllo assomiglia molto al middleware. Quindi, consente di sostituire lo stack con il middleware nel nostro percorso.

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'); 
    } 

); 

Così, mentre potrebbe essere tecnicamente possibile avere controllori in express.js si sarebbe probabilmente essere costretti ad utilizzare strutture di controllo del flusso, che alla fine è lo stesso di middleware.

Problemi correlati