2012-10-04 47 views
28

Estoy escribiendo una aplicación web en node.js usando Express. He definido una ruta de la siguiente manera:Llamando rutas ya definidas en otras rutas en Express NodeJS

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

¿Cómo reutilizo esa ruta desde dentro de expreso?

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

no pude encontrar nada en la documentación de la API y prefieren no utilizar otra biblioteca como "petición", ya que parece kludgey. Estoy tratando de mantener mi aplicación lo más modular posible. ¿Pensamientos?

Gracias

Respuesta

13

Se puede simplemente romper esto en otra función, lo puso en un lugar común e ir de allí?

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

Honestamente, todo este asunto de la anidación de la llamada de vuelta dentro de la app.get(...) no es realmente una gran práctica. Terminas con un archivo gigante que contiene todo el código central.

Lo que realmente quiere es un archivo lleno de app.get() y app.post() declaraciones con todos los controladores de devolución de llamada que viven en diferentes archivos mejor organizados.

+1

¡Gracias! Solo soy un principiante rápido que intenta manejar un proyecto que se está volviendo difícil de manejar. ¿Alguna sugerencia para tutoriales intermedios a avanzados/sitios de ayuda? – user1148710

21

Parecido a lo que dijo Gates, pero yo mantendría el function(req, res){} en su archivo de rutas. Así que me gustaría hacer algo como esto en su lugar:

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

Y luego, en el módulo de la lógica he dividido así:

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

Puede usar el módulo run-middleware exactamente para eso

app.runMiddleware('/firstService/query',function(responseCode,body,headers){ 
    // Your code here 
}) 

Más información:

Revelación: Yo soy el mantenedor & primer desarrollador de este módulo.

+0

¿Se puede utilizar esto con el enrutador y, en caso afirmativo, cómo lo haría frente a los ejemplos que se muestran? ¡Gracias! – Shaun

+0

Morgan muestra información incorrecta de la ruta que ejecuta run-middleware. cualquier ayuda @aminadav –

3

Si usted tiene una gran cantidad de middleware en su ruta, puede beneficiarse de la difusión:

const router = express.Router(); 

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

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

Por http://expressjs.com/es/guide/routing.html ejemplo: 'app.get ('/ example/c', [cb0, cb1, cb2])', parece que no incluso necesita el operador de propagación. Es bueno saber, de cualquier manera! – ryanm

+0

@ryanm Huh. ¡Buena atrapada! –

0

he utilizado siguiente manera: en userpage.js

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

en product.js

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

también puede utilizar en mismas userpage.js enrutador I puede usar para la otra enrutamiento como bien. p.ej.

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

Espero que esto ayude.