在Express NodeJS中调用其他路由中已定义的路由

时间:2012-10-04 23:17:55

标签: node.js express run-middleware

我正在使用Express在node.js中编写一个Web应用程序。我已经定义了一条路线如下:

app.get("/firstService/:query", function(req,res){
    //trivial example
    var html = "<html><body></body></html>"; 
    res.end(html)
});

如何从express中重用该路由?

app.get("/secondService/:query", function(req,res){
    var data = app.call("/firstService/"+query);
    //do something with the data
    res.end(data);
});

我在API文档中找不到任何内容,宁愿不使用像“request”这样的其他库,因为这看起来很糟糕。我想尽可能保持我的应用程序模块化。想法?

由于

5 个答案:

答案 0 :(得分:22)

与盖茨所说的类似,但我会在您的路线文件中保留function(req, res){}。所以我会做这样的事情:

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

然后在你的模块中你的逻辑分裂如下:

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;

答案 1 :(得分:14)

你可以简单地将其分解为另一个函数,将它放在共享位置并从那里开始吗?

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

老实说,将回调嵌套在app.get(...)内的整个业务并不是一个很好的做法。最终得到一个包含所有核心代码的巨型文件。

你真正想要的是一个充满app.get()app.post()语句的文件,所有回调处理程序都存在于不同的,更有条理的文件中。

答案 2 :(得分:3)

如果你的路线上有很多中间件,你可以从传播中受益:

const router = express.Router();

const myMiddleware = [
    authenticationMiddleware(),
    validityCheckMiddleware(),
    myActualRequestHandler
];

router.get( "/foo", ...myMiddleware );
router.get( "/v1/foo", ...myMiddleware );

答案 3 :(得分:1)

您可以完全使用Dim Ar as Variant Ar = Sheets("Sheet").Range("A1:A10000").Value 模块

run-middleware

更多信息:

披露:我是维护者&amp;该模块的第一个开发人员。

答案 4 :(得分:0)

我使用了以下方式: 在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');
                        });

也可以在同一个userpage.js路由器中使用,我也可以用于其他路由。例如。

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

希望这会有所帮助。