Node.js 调用Express NodeJS中其他路由中已定义的路由

Node.js 调用Express NodeJS中其他路由中已定义的路由,node.js,express,run-middleware,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) }); 我在API文档中找不到任何东西,也不想使用另一个库,比如“request”,因为

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

app.get("/firstService/:query", function(req,res){
    //trivial example
    var html = "<html><body></body></html>"; 
    res.end(html)
});
我在API文档中找不到任何东西,也不想使用另一个库,比如“request”,因为这看起来很麻烦。我正在努力使我的应用程序尽可能模块化。想法


谢谢

你能简单地把它分解成另一个函数,放在一个共享的位置并从那里开始吗

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

类似于盖茨所说的,但我会将
函数(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;
var MyModule=function(){
var firstService=函数(queryParam){
var html=“”;
返回html;
}
var secondService=函数(queryParam){
var数据=第一个服务(queryParam);
//对数据做点什么
返回数据;
}
返回{
第一次服务:第一次服务
,secondService:secondService
}
}();
module.exports=MyModule;

您可以使用
运行中间件
模块来实现这一点

app.runMiddleware('/firstService/query',function(responseCode,body,headers){
     // Your code here
})
更多信息:

  • 模块页面在&

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

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

const router = express.Router();

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

router.get( "/foo", ...myMiddleware );
router.get( "/v1/foo", ...myMiddleware );
我采用了以下方法: 在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');
    }); });

希望这会有所帮助。

谢谢!我只是一个快速入门者,正在尝试处理一个越来越难处理的项目。对中级到高级express教程/帮助站点有什么建议吗?这可以用于路由器吗?如果可以,我将如何与所示的示例进行比较?谢谢Morgan显示了运行中间件调用的路由的错误信息。任何帮助@aminadavPer示例:
app.get('/example/c',[cb0,cb1,cb2])
,看起来您甚至不需要spread操作符。不管怎样,很高兴知道@嗯。接得好!这回答了你的问题吗?
router.get('/sitemap', function (req, res, next) {
    router.createSitemap(req, res, function () {
        res.redirect('/sitemap.xml');
    }); });