【问题标题】:Calling already defined routes in other routes in Express NodeJS在 Express NodeJS 的其他路由中调用已经定义的路由
【发布时间】:2012-09-26 02:03:20
【问题描述】:

我正在使用 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”这样的其他库,因为这看起来很笨拙。我试图让我的应用程序尽可能模块化。想法?

谢谢

【问题讨论】:

标签: node.js express run-middleware


【解决方案1】:

你能简单地将它分解成另一个函数,把它放在一个共享的地方,然后从那里开始吗?

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() 语句的文件,其中所有回调处理程序都位于不同的、组织得更好的文件中。

【讨论】:

  • 谢谢!我只是一个 Express 初学者,正在尝试处理一个变得笨拙的项目。对中高级快速教程/帮助网站有什么建议吗?
【解决方案2】:

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

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

然后在您的模块中将您的逻辑拆分如下:

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;

【讨论】:

    【解决方案3】:

    你可以使用 run-middleware 模块来做这个

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

    更多信息:

    披露:我是这个模块的维护者和第一个开发者。

    【讨论】:

    • 这可以与路由器一起使用吗?如果可以,与显示的示例相比,我将如何做到这一点?谢谢!
    • Morgan 显示错误的路由信息​​,由 run-middleware 调用。任何帮助@aminadav
    【解决方案4】:

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

    const router = express.Router();
    
    const myMiddleware = [
        authenticationMiddleware(),
        validityCheckMiddleware(),
        myActualRequestHandler
    ];
    
    router.get( "/foo", ...myMiddleware );
    router.get( "/v1/foo", ...myMiddleware );
    

    【讨论】:

    • Per expressjs.com/en/guide/routing.html 示例:app.get('/example/c', [cb0, cb1, cb2]),看起来您甚至不需要扩展运算符。很高兴知道,不管怎样!
    • @ryanm 嗯。不错的收获!
    【解决方案5】:

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

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 2018-06-18
      • 1970-01-01
      • 2016-04-11
      • 2023-03-31
      相关资源
      最近更新 更多