我可以像这样设置两条路线
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"}
是否有效,但如果结构变得更长,它似乎会变得冗长且难以维护。最好的方法是什么?是否有更短的方法来嵌套这些?
答案 0 :(得分:6)
index.js中的代码使您很难理解您想要的内容。到目前为止,我理解你想要一个类似/sub1/:id/sub2
的路由,但更容易编写和维护,并且在index.js中。
所以是的,你可以做到,而且非常简单。
您只需要require
中的sub1
sub2
和use
以及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的前缀,只需在一个位置更改它。