Appel de routes déjà définies dans D'autres routes dans express NodeJS
J'écris une application web dans node.js utilisant Express. J'ai défini une route comme suit:
app.get("/firstService/:query", function(req,res){
//trivial example
var html = "<html><body></body></html>";
res.end(html)
});
Comment réutiliser cette route depuis express?
app.get("/secondService/:query", function(req,res){
var data = app.call("/firstService/"+query);
//do something with the data
res.end(data);
});
Je n'ai rien trouvé dans la documentation de L'API et je préfère ne pas utiliser une autre bibliothèque comme "request" car cela semble kludgey. J'essaie de garder mon application modulaire que possible. Pensées?
Merci
5 réponses
Pouvez-vous simplement casser cela dans une autre fonction, le mettre dans un endroit partagé et partir de là?
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);
Honnêtement, toute cette affaire d'imbrication du rappel à l'intérieur du app.get(...)
n'est pas vraiment une bonne pratique. Vous vous retrouvez avec un fichier géant contenant tout le code de base.
Ce que vous voulez vraiment, c'est un fichier rempli d'instructions app.get()
et app.post()
avec tous les gestionnaires de rappel vivant dans des fichiers différents et mieux organisés.
Similaire à ce que Gates a dit, Mais je garderais le function(req, res){}
dans votre fichier routes. Donc, je ferais quelque chose comme ça à la place:
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);
});
Et puis dans votre module, votre logique est divisée comme suit:
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;
Si vous avez beaucoup de middleware sur votre itinéraire, vous pouvez bénéficier de la diffusion:
const router = express.Router();
const myMiddleware = [
authenticationMiddleware(),
validityCheckMiddleware(),
myActualRequestHandler
];
router.get( "/foo", ...myMiddleware );
router.get( "/v1/foo", ...myMiddleware );
Vous pouvez utiliser le module run-middleware
exactement pour cela
app.runMiddleware('/firstService/query',function(responseCode,body,headers){
// Your code here
})
Plus d'informations:
- Page du Module
- dans Github & NPM ;
- Exemples d'utilisation d'exécution middleware module
Divulgation: je suis le mainteneur et le premier développeur de ce module.
J'ai utilisé la manière suivante: chez userpage.js
router.createSitemap = function(req, res, callback) { code here callback(value); }
Au produit.js
var userPageRouter = require('userpages');
userPageRouter.createSitemap(req, res, function () {
//console.log('sitemap');
});
Peut également utiliser dans le même userpage.routeur js que je peux utiliser pour d'autres routages. par exemple.
router.get('/sitemap', function (req, res, next) {
router.createSitemap(req, res, function () {
res.redirect('/sitemap.xml');
}); });
J'espère que cela aidera.