使用Express嵌套路由器的正确/最简单的方法

125*_*748 9 javascript router node.js 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);
});
Run Code Online (Sandbox Code Playgroud)

./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;
Run Code Online (Sandbox Code Playgroud)

./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;
Run Code Online (Sandbox Code Playgroud)

为简洁起见./routes/sub2.js看起来完全相同,但其变量名为subTwo

在sub1下嵌套sub2的最短方法是什么?在index.js中,我试过了

var subOne = router.use('/sub1', require('./sub1'));
subOne.use('/sub2', require('./sub2'));
Run Code Online (Sandbox Code Playgroud)

但那根本不起作用.在index.js内

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

是否有效,但如果结构变得更长,它似乎会变得冗长且难以维护.最好的方法是什么?是否有更短的方法来嵌套这些?

Nae*_*ikh 6

index.js中的代码使您很难理解您想要的内容.到目前为止,我理解你想要一条路径,/sub1/:id/sub2但更容易编写和维护,并在index.js内.

所以是的,你可以做到这一点而且非常简单.你只需要require sub1sub2use sub2sub1,那么你可以安装sub1在路由器上.例如:

var sub1= require('./sub1');
var sub2 = require('./sub2');
sub1.use(sub2);
router.use('/sub1:id', sub1);
Run Code Online (Sandbox Code Playgroud)

所以你的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);
});
Run Code Online (Sandbox Code Playgroud)

这不是很难维护.如果这不是你想要的,请告诉我.