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

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

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

我如何从expression式中重用这条路线?

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

我找不到API文档中的任何内容,而不愿意使用另一个类似“请求”的库,因为这似乎是kludgey。 我试图让我的应用尽可能模块化。 思考?

谢谢

你可以简单地把它分解成另一个function,把它放在一个共享的地方,然后从那里去?

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

老实说,把这个callbackapp.get(...)app.get(...)整个业务并不是一个很好的做法。 你最终得到一个包含所有核心代码的巨大文件。

你真正想要的是一个充满了app.get()app.post()语句的文件,所有的callback处理程序生活在不同的,更好的组织文件中。

类似于盖茨所说的,但我会保留你的路线文件中的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; 

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

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

您可以使用run-middleware模块

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

更多信息:

  • Github & NPM中的模块页面;
  • 使用运行中间件模块的例子

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

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

希望这会有所帮助。