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

29
demandé sur Aminadav Glickshtein 2012-10-05 03:17:55

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.

14
répondu Gates VP 2017-12-08 00:59:51

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;
22
répondu c0deNinja 2012-10-05 04:13:37

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 );
3
répondu Der Hochstapler 2016-11-14 12:08:56

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 mainteneur et le premier développeur de ce module.

1
répondu Aminadav Glickshtein 2016-09-14 13:15:45

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.

0
répondu Dhiraj 2017-11-19 10:54:29