2014-12-05 5 views
2

노드 라우팅을 HTML/App 및 REST의 두 부분으로 분리하려고했습니다. 여기에 내가 무슨 짓을했는지 있습니다 :NodeJS/Express app.use 시퀀스 및 사용법

app.js :

var appPort = process.env.PORT || 80; 
var express = require('express'); 
var http = require('http'); 
var appRouter = require('./routes/index'); 
var restRouter = require('./routes/rest'); 
var app = express(); 
var srv = http.createServer(app); 

app.set('port', appPort); 
app.set('view engine', 'jade'); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/api/rest/', restRouter); // this seems not working .. I never get the expected response 
app.use('/', appRouter);   // I get this even with localhost/api/rest/... 

var server = srv.listen(app.get('port'), function() { 
    debug('Express server listening ' + server.address().address + ':' + server.address().port); 
}); 

하는 index.js :

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

router.get('/*', function (req, res) { 
    res.send('HOME') 
}); 

module.exports = router; 

rest.js

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

router.get('/api/rest/*', function(req, res) { 
    res.send('REST API'); 
}); 

module.exports = router; 

내 질문 :
1 일반적으로 이런 식으로 여러 개의 라우터를 구축 할 수 있습니까?
2. get.use의 순서가 중요합니까? 그리고/또는 '다음'을 처리해야합니까? 경우
3. 나는이 같은 매개 변수를 넘겨 줄 수있는 라우터의 내부 데이터베이스에 액세스하려는 모든 도움을

// ... 
var client = new pg.Client(dbConnection); 
// ... 
app.use('/', appRouter(client)); 

감사합니다!

답변

4

1) 이렇게 여러 라우터를 만들 수 있습니다.

당신이 사용하고 있기 때문에 :

app.use('/api/rest/', restRouter); 

경로 호출을 rest.js이 코드는 다음과 같이 할 수 rest.js에서 수정해야 의미 /api/rest/에 상대됩니다에 :

router.get('*', function(req, res) { 
    res.send('REST API'); 
}); 

I GitHub에서 Express multi-router example을 볼 수도 있습니다. 버전이 지정된 경로가있는 REST 앱을 보여줌으로써이 점을 매우 명확하게 보여줍니다.

2) 일의 순서는

Express documentation for app.use를 참조 중요 당신은주의 할 것이다 :

미들웨어 기능 따라서 미들웨어 포함의 순서는 중요 순차적으로 실행됩니다. 당신이 당신의 app.use 호출의 순서를 반대로하면 당신이 당신의 목적을 물리 치고 ... 다른 경로에 도착하기 전에

, index.jsrouter.get('/*', function (req, res) { 라인은 모든 것을 잡을 것입니다.

next도 호출하지 않으면 Express는 사용자가 완료되었다는 것을 알 수 없으며 다음 미들웨어 또는 라우트를 계속 진행할 수도 없습니다.

3) 데이터베이스 질문은 모듈/범위 질문

이 특급 질문보다 범위 질문을 더입니다. 나는 자바 스크립트 범위에 대한 훌륭한 글쓰기와 또한 어떻게 수행하는지에 대해서도 알아볼 것을 제안한다. Node handles modules.

+0

감사합니다. Matt,이 점이 많은 도움이됩니다.언급 된 자료들을 파헤쳐 보겠습니다. 나는 그것을 얻을 것입니다. – Rainer

+0

유일하게 남은 질문 : 순서가 중요하고 app.use (/) 전에 app.use (/ api/rest /)를 포함하고 있다면 두 번째 app.use가 api/rest 호출을 catch하지 않을까요? – Rainer

+0

잠재적으로 일치 할 수 있습니다. 실행을 멈출 수있는 몇 가지 사항이 있습니다 ('res.end'는 하나입니다, 믿습니다).하지만 그렇게되지 않으면 Express는 다음 미들웨어 구성 요소로 이동하여 실행합니다. –