2016-09-29 35 views
9

mogę skonfigurować dwie trasy takie jak taCorrect/Concisest sposób routery gniazdo 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; 

dla zwięzłości ./routes/sub2.js wygląda dokładnie tak samo, ale jego zmienne są nazwane subTwo

Jaka jest najkrótsza droga do gniazda sub2 pod SUB1? W ciągu index.js Próbowałem

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

Ale to nie działa w ogóle. W ciągu index.js

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

działa, ale wydaje się to może dostać rozwlekły i trudny do utrzymania, jeśli struktura dostał znacznie dłużej. Jaki jest najlepszy sposób na zrobienie tego? Czy istnieje krótszy sposób ich zagnieżdżenia?

+0

Twój adres URL powinien być localhost: 3000/routes/... aw twoim sub1.js musisz zdefiniować trasę taką jak ten 'subOneRouter. get ('/: id/sub2', require ('./ sub2.js'); ', a URL będzie localhost: 3000/routes/sub1/123/sub2 – Molda

Odpowiedz

6

Twój kod w index.js utrudnia zrozumienie, czego chcesz. Do tej pory rozumiem, że chcesz mieć trasę taką jak /sub1/:id/sub2, ale łatwiej ją pisać i konserwować, a także w pliku index.js.

Więc tak, możesz to zrobić i to całkiem proste. Wystarczy requiresub1 i sub2 i usesub2 w sub1, wówczas można zamontować sub1 na routerze. Ex:

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

Więc index.js staje

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

Nie byłoby to bardzo trudne do utrzymania. Daj mi znać, jeśli nie tego szukasz.

-1

Sposób, w jaki zaleciłbym zapisanie twoich tras node.js, miałby mieć plik routes.js, który będzie zawierał wszystkie twoje trasy.

Następnie można umieścić w twojej routes.js złożyć swoją drogę do SUB1, tak:

const router = require('express').Router(); 

const sub1 = require('./sub1'); 
router.use('/sub1', sub1); 

module.exports = router; 

będę wtedy w sub1.js, umieścić swoją trasę sub2, tak:

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; 

Spowoduje to, że wszystkie twoje trasy 1 będą miały prefiks "/ sub1", a wszystkie twoje przedrostki sub2, wewnątrz sub1, mają przedrostek "/: id/sub2". Możesz wtedy swobodnie umieszczać dowolne trasy wewnątrz sub2, które chcesz.

Korzystanie z tej konfiguracji oznacza, że ​​jeśli kiedykolwiek chcesz zmienić prefiks dla sub1 lub sub2, po prostu zmień go w jednym miejscu.

2

Więc trzeba

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

jeśli dobrze rozumiem, chcesz te trasy:

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

Więc rozwiązaniem może być coś podobnego do tego:

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

Jest do ciebie, aby zdecydować, że będzie tam podrzędny identyfikator o nazwie "sub2"
Caus e każde żądanie do zasobu o identyfikatorze "sub2" zostanie wykonane przez routerB