Calling already defined routes in other routes in Express NodeJS

后端 未结 5 1502
傲寒
傲寒 2020-12-29 20:11

I am writing a web app in node.js using Express. I have defined a route as follows:

app.get(\"/firstService/:query\", function(req,res){
    //trivial exampl         


        
相关标签:
5条回答
  • 2020-12-29 20:38

    Can you simply break this out into another function, put it in a shared spot and go from there?

    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);
    

    Honestly, this whole business of nesting the call back inside of the app.get(...) is not really a great practice. You end up with a giant file containing all of the core code.

    What you really want is a file filled with app.get() and app.post() statements with all of the callback handlers living in different, better organized files.

    0 讨论(0)
  • 2020-12-29 20:43

    I have used following way: at userpage.js

    router.createSitemap = function(req, res, callback) {  code here callback(value);  }
    

    at product.js

    var userPageRouter = require('userpages'); 
    userPageRouter.createSitemap(req, res, function () {
                                //console.log('sitemap');
                            });
    

    Also can use in same userpage.js router I can use for other routing as well. eg.

    router.get('/sitemap', function (req, res, next) {
        router.createSitemap(req, res, function () {
            res.redirect('/sitemap.xml');
        }); });
    

    Hope this will help.

    0 讨论(0)
  • 2020-12-29 20:45

    Similar to what Gates said, but I would keep the function(req, res){} in your routes file. So I would do something like this instead:

    routes.js

    var myModule = require('myModule');
    
    app.get("/firstService/:query", function(req,res){
        var html = myModule.firstService(req.params.query);
        res.end(html)
    });
    
    app.get("/secondService/:query", function(req,res){
        var data = myModule.secondService(req.params.query);
        res.end(data);
    });
    

    And then in your module have your logic split up like so:

    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;
    
    0 讨论(0)
  • 2020-12-29 20:48

    You can use run-middleware module exactly for that

    app.runMiddleware('/firstService/query',function(responseCode,body,headers){
         // Your code here
    })
    

    More info:

    • Module page in Github & NPM;
    • Examples of use run-middleware module

    Disclosure: I am the maintainer & first developer of this module.

    0 讨论(0)
  • 2020-12-29 20:49

    If you have a lot of middleware on your route, you can benefit from spreading:

    const router = express.Router();
    
    const myMiddleware = [
        authenticationMiddleware(),
        validityCheckMiddleware(),
        myActualRequestHandler
    ];
    
    router.get( "/foo", ...myMiddleware );
    router.get( "/v1/foo", ...myMiddleware );
    
    0 讨论(0)
提交回复
热议问题