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

时间:2016-09-29 00:38:33

标签: javascript node.js express router

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

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

./路由/ 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;

./路由/ 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 看起来完全一样,但其变量名为 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"}

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

3 个答案:

答案 0 :(得分:6)

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

所以是的,你可以做到,而且非常简单。 您只需要require中的sub1 sub2use以及sub2 sub1,然后您就可以在路由器上安装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);
});

这不会很难维护。如果这不是您想要的,请告诉我。

答案 1 :(得分:2)

所以你有

/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

所以你的解决方案可能与此类似:

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'的资源的任何请求将由routerB

采取一种方式

答案 2 :(得分:-1)

我建议你编写node.js路由的方法是有一个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的前缀,只需在一个位置更改它。