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:
- Página de módulo en Github y NPM ;
- Ejemplos de uso run-middleware module
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;