2014-09-24 5 views
2

노드 익스프레스에서 라우트를 확장 가능하게 설정하려고합니다.확장 가능 노드 익스프레스 라우트

나는 워킹 경로를 설정하는 방법을 알고있다 ... 그것은 내가 고민하고있는 실패/불일치이다. 더 구체적으로 말하자면 404 오류를 처리하는 방법에 어려움을 겪고 있습니다.

여기

내가 무엇을 가지고 ...

app.get('/:folder',function(req,res) { 
    var path = 'site/' + req.params.folder + '/index.jade'; 
    res.render(path); 
}); 

app.get('/:folder/:topic',function(req,res) { 
    var path = 'site/' + req.params.folder + '/' + req.params.topic; 
    res.render(path); 
}); 

app.use(function(req, res, next){ 
    res.status(404).render('site/404.jade'); 
}); 

도전이며, : 폴더 : 주제에서는 404 않을 것 화재, 그래서 아무것도 일치합니다. 우리의 폴더와 주제 이름을 모두 단단하게 코딩하고 싶지는 않습니다. 그렇다면 폴더/토픽이 존재하지 않으면 요청이 404 단계로 넘어 가게 내 라우팅을 어떻게 설정할 수 있습니까?

감사합니다. 다음과 같이

UPDATE

최종, 작업 솔루션입니다. 고마워, 모두들.

var fs = require('fs'); 

app.get('/:folder',function(req,res,next) { 
    var path = __dirname + '/views/site/' + req.params.folder + '/index.jade'; 

    if(fs.existsSync(path)) 
    { 
     res.render(path); 
    } 
    else 
    { 
     next(); 
    } 
}); 

app.get('/:folder/:topic',function(req,res,next) { 
    var path = __dirname + '/views/site/' + req.params.folder + '/' + req.params.topic + '.jade'; 

    if(fs.existsSync(path)) 
    { 
     res.render(path); 
    } 
    else 
    { 
     next(); 
    } 
}); 

app.use(function(req, res){ 
    res.status(404).render('site/404.jade'); 
}); 
+0

제안에 감사드립니다. –

답변

5

app.get에 전달 된 세 번째 (선택 사항) 매개 변수에있다 : next. next은 실제로 경로가 다음 목적지로 넘어가도록 호출 할 수있는 콜백입니다.

그래서, 당신은 같은 것을 할 수 있습니다

app.get('/:folder',function(req, res, next) { 
    var path = 'site/' + req.params.folder + '/index.jade'; 
    var pathIsValid = ... // use something like fs.exists to check if the path is valid 
    if (pathIsValid) { 
     res.render(path); 
    } else { 
     next() 
    } 
}); 

를 다음 호출 할 경우, 다음 경로를 시도 할 것이다. 그 (및 다른 사람들)가 다음에 전화를 걸면 404 핸들러로 연결됩니다.

2

폴더 경로와 주제 경로에서보기 경로가 존재하는지 확인하려면 fs.exists을 사용해야하고 그렇지 않은 경우 next()을 아무 것도 렌더링하지 않고 호출해야합니다. 그런 다음 라우팅은 404 핸들러로 진행합니다. 우리가 /folder/topic 같은 URL이있는 경우

1

그것은 경로 (1)을 만족하고, 요청이 처리되고,

app.get('/:folder/:topic',function(req,res) { 
    var path = 'site/' + req.params.folder + '/' + req.params.topic; 
    if(fileExists(path)) { 
     res.render(path); 
    } else { 
     res.status(404).render('site/404.jade');   
    } 
}); 

app.get('/:folder',function(req,res) { 
    var path = 'site/' + req.params.folder + '/index.jade'; 
    if(fileExists(path)) { 
     res.render(path); 
    } else { 
     res.status(404).render('site/404.jade');   
    } 
}); 


app.all('*', function(req, res){ 
    res.status(404).render('site/404.jade'); 
}); 

을 시도합니다. 우리가 /folder URL이있는 경우 , 그것은 경로 1을 만족하지 만, 만족 경로 2. 우리는 우리가 해당 템플릿 예를 들어 http://nodejs.org/api/fs.html#fs_fs_existssync_path, 존재, 경로 3.

fileExists을 확인하기 위해 몇 가지 기능입니다 렌더링보다 다른 무언가가있는 경우,

관련 문제