在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'); }); });
希望这会有所帮助。