2012-10-04 25 views
28

Piszę aplikację internetową w pliku node.js za pomocą Express. Zdefiniowałem trasę w następujący sposób:Wywoływanie już zdefiniowanych tras na innych trasach w Express NodeJS

app.get("/firstService/:query", function(req,res){ 
    //trivial example 
    var html = "<html><body></body></html>"; 
    res.end(html) 
}); 

Jak mogę ponownie użyć tej trasy z ekspresu?

app.get("/secondService/:query", function(req,res){ 
    var data = app.call("/firstService/"+query); 
    //do something with the data 
    res.end(data); 
}); 

nie mogłem znaleźć coś w dokumentacji API i raczej nie używać innej biblioteki jak „życzenie”, ponieważ to wydaje kludgey. Staram się, aby moja aplikacja była jak najbardziej modułowa. Myśli?

Dzięki

Odpowiedz

13

można po prostu podzielenie się do innej funkcji, umieścić go w udostępnionym miejscu i go stamtąd?

var queryHandler = require('special_query_handler'); 
// contains a method called firstService(req, res); 

app.get('/firstService/:query', queryHandler.firstService); 

// second app 
app.get('/secondService/:query', queryHandler.secondService); 

Szczerze mówiąc, cała ta działalność gniazdowania połączenie z powrotem wewnątrz app.get(...) naprawdę nie jest wielka praktyka. W efekcie otrzymujesz gigantyczny plik zawierający cały podstawowy kod.

To, czego naprawdę chcesz, to plik wypełniony app.get() i app.post() ze wszystkimi instrukcjami obsługi wywołań zwrotnych, które znajdują się w różnych, lepiej zorganizowanych plikach.

+1

Dziękujemy! Jestem tylko początkującym Expressem, który stara się opanować projekt, który staje się nieporęczny. Wszelkie sugestie dotyczące pośrednich i zaawansowanych zaawansowanych poradników/witryn pomocy? – user1148710

21

Podobny do tego, co powiedział Gates, ale zachowałbym function(req, res){} w twoim pliku tras. Więc chciałbym zrobić coś takiego zamiast:

routes.js

var myModule = require('myModule'); 

app.get("/firstService/:query", function(req,res){ 
    var html = myModule.firstService(query); 
    res.end(html) 
}); 

app.get("/secondService/:query", function(req,res){ 
    var data = myModule.secondService(query); 
    res.end(data); 
}); 

, a następnie w module mają swoją logikę podzielone tak:

myModule.js

var MyModule = function() { 
    var firstService= function(queryParam) { 
     var html = "<html><body></body></html>"; 
     return html; 
    } 

    var secondService= function(queryParam) { 
     var data = firstService(queryParam); 
     // do something with the data 
     return data; 
    } 

    return { 
     firstService: firstService 
     ,secondService: secondService 
    } 
}(); 

module.exports = MyModule; 
0

Możesz użyć modułu run-middleware dokładnie dla tego

Więcej informacji:

Ujawnienie: Jestem opiekun & pierwszy deweloper tego modułu.

+0

Czy można go używać z routerem, a jeśli tak, to jak mam to zrobić w porównaniu z przykładami? Dzięki! – Shaun

+0

Morgan pokazuje złe informacje o trasie, która jest wywoływana przez run-middleware. każda pomoc @aminadav –

3

Jeśli masz dużo middleware na trasie, można skorzystać z rozprzestrzeniania:

const router = express.Router(); 

const myMiddleware = [ 
    authenticationMiddleware(), 
    validityCheckMiddleware(), 
    myActualRequestHandler 
]; 

router.get("/foo", ...myMiddleware); 
router.get("/v1/foo", ...myMiddleware); 
+1

Według http://expressjs.com/en/guide/routing.html przykład: 'app.get ('/ example/c', [cb0, cb1, cb2])', wygląda na to, że nie potrzebuje nawet operatora rozprzestrzeniania. Miło wiedzieć, tak czy owak! – ryanm

+0

@ryanm Huh. Dobry chwyt! –

0

Użyłem następujący sposób: na userpage.js

router.createSitemap = function(req, res, callback) { code here callback(value); } 

w product.js

var userPageRouter = require('userpages'); 
userPageRouter.createSitemap(req, res, function() { 
          //console.log('sitemap'); 
         }); 

Można również używać w tym samym routerze userpage.js, którego można użyć do innych tras jako dobrze. na przykład.

router.get('/sitemap', function (req, res, next) { 
    router.createSitemap(req, res, function() { 
     res.redirect('/sitemap.xml'); 
    }); }); 

Mam nadzieję, że to pomoże.

Powiązane problemy