正确/最简单的方法来嵌套路由器与Express

我可以设置两条这样的路线

index.js

var express = require('express'); var app = express(); var router = express.Router(); const PORT = 3001; app.get('/', function(req, res){ res.send('hello app'); }); app.use('/routes', require('./routes')); app.listen(PORT, function(){ console.log('listening on port:', PORT); }); 

./routes/index.js

 var express = require('express'); var app = express(); var router = express.Router(); router.use('/sub1', require('./sub1')); router.use('/sub2', require('./sub2')); module.exports = router; 

./routes/sub1.js

 var express = require('express'); var app = express(); var subOneRouter = express.Router(); subOneRouter.get('/', function(req, res){ res.json({route: 'sub1-base'}); }); subOneRouter.get('/:id', function(req, res){ res.json({'route': 'sub1-base', 'id': req.params.id}); }); module.exports = subOneRouter; 

为了简洁,./ routes/sub2.js看起来完全一样,但其variables名为subTwo

在sub1下嵌套sub2的最简单方法是什么? 在index.js内我已经尝试过了

 var subOne = router.use('/sub1', require('./sub1')); subOne.use('/sub2', require('./sub2')); 

但是这根本不起作用。 在index.js中

 router.use('/sub1/:id/sub2', require('./sub2')); //localhost:3000/sub1/123/sub2/456 => { "route": "sub2-base","id":"456"} 

工作,但如果结构变得更长,似乎可能会变得冗长和难以维持。 什么是最好的方法来做到这一点? 有没有更简单的方法来嵌套这些?

你在index.js中的代码很难理解你想要的东西。 到目前为止,我明白你想要像/sub1/:id/sub2这样的路线,但是在index.js里面更容易编写和维护。

所以是的,你可以做到这一点很简单。 你只需要sub1sub2并在sub1 use sub2 ,然后你可以在路由器上安装sub1 。 例如:

 var sub1= require('./sub1'); var sub2 = require('./sub2'); sub1.use(sub2); router.use('/sub1:id', sub1); 

所以你的index.js成为,

 var express = require('express'); var app = express(); var router = express.Router(); const PORT = 3001; app.get('/', function(req, res){ res.send('hello app'); }); var sub1= require('./sub1'); var sub2 = require('./sub2'); sub1.use(sub2); router.use('/sub1:id', sub1); app.listen(PORT, function(){ console.log('listening on port:', PORT); }); 

这不会很难保持。 让我知道如果这不是你在找什么。

所以你有了

 /routes/sub1 /routes/sub1/:id /routes/sub2 /routes/sub2/:id 

如果我理解正确,你想要这些路线:

 /routes/sub1/sub2 /routes/sub1/sub2/:id /routes/sub1/:id/sub2 /routes/sub1/:id/sub2/:id 

所以你的解决scheme可以是这样的:

 var express = require('express'), app = express(); routerA = express.Router(), routerB = require('./sub2'); routerA.get('/', function(req, res) { console.log('sub1 base') }); //The next 2 mounts order matters, cause they can overlap each other routerA.use('/sub2', routerB); //routes/sub1/sub2 + routes/sub1/sub2/:id routerA.get('/:id', function(req, res) { console.log('sub1 id:' + req.params.id) }); routerA.use('/:id/sub2', routerB); //routes/sub1/:id/sub2 + routes/sub1/:id/sub2/:id app.use('/routes', routerA); app.listen(3000); 

你决定是否会有一个名为“sub2”的sub1-id
因为任何请求的资源ID为'sub2'将采取由路由器B的方式

我build议编写node.js路由的方式是创build一个routes.js文件,它将包含所有的路由。

然后你可以在你的routes.js文件中放置你的sub1路由,就像这样:

 const router = require('express').Router(); const sub1 = require('./sub1'); router.use('/sub1', sub1); module.exports = router; 

我会然后,在sub1.js,把你的sub2路线,如下所示:

 const subOneRouter = require('express').Router(); subOneRouter.get('/', function(req, res){ res.json({route: 'sub1-base'}); }); subOneRouter.get('/:id', function(req, res){ res.json({'route': 'sub1-base', 'id': req.params.id}); }); const sub2 = require('./sub2'); subOneRouter.use('/:id/sub2); module.exports = subOneRouter; 

这将使你所有的sub1路由的前缀都是'/ sub1',而你在sub1里的所有sub2前缀都有一个前缀'/:id / sub2'。 然后,你可以随意把你想要的sub2内的任何路线。

使用这个设置意味着如果你想改变sub1或者sub2的前缀,你可以在一个地方改变它。