2016-11-24 4 views
0

Ich habe folgende Streckenverschachtelte Routen in Express.js

definiert
router.get('/:company', function (req, res, next) { 
    // 1. call database and get company data 
    // 2. render company view 
}) 

router.get('/:company/employees', function (req, res, next) { 
    // 1. call database and get company data 
    // 2. call database and get employees data 
    // 3. render employees view 
}) 

Wie kann ich diese zwei Routen fusionieren nur einen Aufruf an die Datenbank machen Unternehmensdaten zu erhalten. Im Grunde möchte ich nur diese Logik wiederverwenden.

Ich bin für so etwas suchen (getestet, aber es funktioniert nicht)

router.get('/:company', function (req, res, next) { 
    // 1. call database and get company data 
    // 2. render company view 

    router.get('/:company/employees', function (req, res, next) { 
     // no need to call database to get company data. we already have it 
     // 1. call database and get employees data 
     // 2. render employees view 
    }) 

}) 
+0

Sie können keine Routen Nest. Dies verursacht Chaos. Zuerst ist die Route nicht einmal aktiv, bis die Elternroute zuerst getroffen wird, und dann wird jedes Mal, wenn die Elternroute getroffen wird, ein neuer Routenhandler (und somit ein Duplikatroutenhandler) installiert. Kann es nicht so machen. Verschieben Sie den allgemeinen Code in eine gemeinsame Funktion, die Sie von mehreren Routen aus aufrufen können. Es ist witzig, wie die Express-Route-Handler-Architektur die grundlegenden Programmierprinzipien des gemeinsamen Codes in eine gemeinsam genutzte Funktion, die von mehreren Stellen aufgerufen werden kann, vergessen lässt. – jfriend00

+0

@ jfriend00 - "_ Es ist witzig, wie die Express-Route-Handler-Architektur irgendwie die grundlegenden Programmierprinzipien des gemeinsamen Codes in eine gemeinsam genutzte Funktion vergessen lässt, die von mehreren Orten aus aufgerufen werden kann._": P – Rayon

+0

ja ist lustig. hahaha. – handsome

Antwort

3

eine gemeinsame Funktion haben für Sie, dass die Daten zu erhalten. Routen getrennt halten!

function getCompanyData(input, cb) { 
    //DB operation 
    return cb(data); 
} 

function getEmployeeData(input, cb) { 
    //DB operation 
    return cb(data); 
} 
router.get('/:company', function(req, res, next) { 
    getCompanyData({ 
    data: data 
    }, function(err, data) { 
    //reder view 
    }); 
}) 

router.get('/:company/employees', function(req, res, next) { 
    getCompanyData({ 
    data: data 
    }, function(err, data) { 
    if (!err) { 
     getEmployeeData({ 
     data: data 
     }, function(err, data) { 
     //reder view 
     }) 
    } 
    }); 
}) 
+0

Ich empfehle, das Modul 'async' zu verwenden, wenn mit mehreren asynchronen Aufrufen in einer Funktion gearbeitet wird und insbesondere mit der 'Wasserfall'-Methode. http://caolan.github.io/async/docs.html#waterfall – mxncson

+0

@mxncson - Ich würde sagen, dass es "abhängt" .. Ich würde 'async' für solch einen kleinen Anwendungsfall vermeiden. – Rayon

Verwandte Themen