web-dev-qa-db-fra.com

Appel de routes déjà définies dans d'autres routes dans Express NodeJS

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

29
user1148710

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.

14
Gates VP

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;
22
c0deNinja

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 );
3
Der Hochstapler

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.

1

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.

0
Dhiraj