2012-10-04 55 views
28

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

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文档中找不到任何东西,宁愿不使用另一个库,比如“请求”,因为这看起来很糟糕。我试图让我的应用尽可能模块化。思考?

感谢

回答

13

你能简单地打破了这一点到另一个函数,把它放在一个共享点,并从那里走?

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

+1

谢谢!我只是一个Express初学者,他正试图处理一个变得笨拙的项目。任何关于中级到高级快递教程/帮助网站的建议? – user1148710

21

与盖茨所说的相似,但我会将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; 
0

您可以正好使用run-middleware模块

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

更多信息:

披露:我是这个模块的维护者&第一显像。在userpage.js

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

在product.js :

+0

这可以与路由器一起使用吗?如果是的话,我将怎么做呢?谢谢! – Shaun

+0

Morgan正在显示运行中间件调用的路由的错误信息。任何帮助@aminadav –

3

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

const router = express.Router(); 

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

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

根据http://expressjs.com/en/guide/routing.html示例:'app.get('/ example/c',[cb0,cb1,cb2])',看起来你不会甚至需要传播运营商。很高兴知道,无论哪种方式! – ryanm

+0

@ryanm Huh。好的赶上! –

0

我用下面的方式

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

希望这会有所帮助。