J'écris une application Web dans node.js avec Express. J'ai défini un itinéraire comme suit:
app.get("/firstService/:query", function(req,res){
//trivial example
var html = "<html><body></body></html>";
res.end(html)
});
Comment puis-je 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 ne pouvais rien trouver dans la documentation de l'API et ne préfèrerais pas utiliser une autre bibliothèque telle que "request", car cela semble kludgey. J'essaie de garder mon application aussi modulaire que possible. Pensées?
Merci
Pouvez-vous simplement décomposer cela dans une autre fonction, le placer 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 de ré-imbrication de l'appel dans la 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 contenant les instructions app.get()
et app.post()
avec tous les gestionnaires de rappel installés dans des fichiers différents, mieux organisés.
Semblable à ce que Gates a dit, mais je garderais la function(req, res){}
dans votre fichier de routes. Alors 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 ensuite, dans votre module, votre logique est séparée de la manière suivante:
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 propagation:
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:
Divulgation: Je suis le responsable et le premier développeur de ce module.
J'ai utilisé la manière suivante: À userpage.js
router.createSitemap = function(req, res, callback) { code here callback(value); }
à product.js
var userPageRouter = require('userpages');
userPageRouter.createSitemap(req, res, function () {
//console.log('sitemap');
});
Peut également utiliser le même routeur userpage.js que je peux également utiliser pour un autre routage. par exemple.
router.get('/sitemap', function (req, res, next) {
router.createSitemap(req, res, function () {
res.redirect('/sitemap.xml');
}); });
J'espère que cela aidera.