route node code another node.js express run-middleware

node.js - code - Llamar a rutas ya definidas en otras rutas en Express NodeJS



express url params (5)

Estoy escribiendo una aplicación web en node.js usando Express. He definido una ruta de la siguiente manera:

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 express?

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 preferiría no usar otra biblioteca como "solicitud" porque parece kludgey. Estoy tratando de mantener mi aplicación lo más modular posible. ¿Pensamientos?

Gracias


¿Puedes simplemente dividir esto en otra función, ponerla en un lugar compartido e ir desde 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 anidar la llamada 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() con todos los manejadores de devolución de llamada que viven en archivos diferentes y mejor organizados.


He usado la 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 puedo usarlo en el mismo enrutador userpage.js que puedo usar para otras rutas también. p.ej.

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

Espero que esto ayude


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:

Divulgación: soy el mantenedor y el primer desarrollador de este módulo.


Si tiene mucho middleware en su ruta, puede beneficiarse de la divulgación:

const router = express.Router(); const myMiddleware = [ authenticationMiddleware(), validityCheckMiddleware(), myActualRequestHandler ]; router.get( "/foo", ...myMiddleware ); router.get( "/v1/foo", ...myMiddleware );


Similar a lo que dijo Gates, pero yo mantendría la function(req, res){} en su archivo de rutas. Entonces, yo haría algo como esto:

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 tu módulo tienes tu lógica dividida 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;