2016-10-25 6 views
0

다음과 같이 Express Router를 코드로 사용합니다.노드 JS Express 라우팅이 처리되지 않음/올바르게 처리되지 않음

첫 번째 정의는 올바른 localhost : 3000/tests를 허용합니다. 첫 번째 정의는 localhost : 3000/tests /를 허용하며 이는 틀린 것 같습니다.

두 번째 URL이 여기에 허용되면 잘못된 상대 URL (예 : 두 번째 URL을 수락 할 때/hello가 아닌/tests/hello가 됨)을 생성하는 HTML이 생성됩니다. 왜 이런 일이 일어나는 걸까요? 후행하는 슬래시가있는 URL이 일치하지 않도록하려면 어떻게해야합니까? 양쪽 모두를 받아 들여야 만한다면 상대 URL을 어떻게 생성 할 것인가? 내가 볼

//tests.js: 

const router = express.Router(); 

// accepts /tests AND /tests/ 
router.get('/', function(req, res, next) { 
}); 

// accepts /tests/new AND /tests/new/ 
router.get('/new', function(req, res, next) { 
}); 

//app.js 

var tests = require('./routes/tests'); 
app.use('/tests', tests); 

모든 Node.js를 예제 코드는 내가 잘못 가고 어디 잘 모르겠어요 그래서 "/"와 "/ foo는"같은 경로를 사용합니다.

추가 편집 :

수신 URL을 만들 때 생성됩니다. 경로 처리기가/tests 및/tests /를 모두 허용하면 마지막 슬래시가 콘크리트 경로 형성에 큰 영향을주기 때문에 빌드 된 상대 URL은 다른 경로로 해석됩니다. 나는 전개 된 환경에서이 애플리케이션이 proxys를 사용하는 아파치에 의해 전달되므로 노드 페이지의 전체 URL은 example.com/myapp/tests와 같은 컨텍스트를 갖는다 고 덧붙여 야한다. 내 devleopment 환경의 경로가 다를 수 있습니다 (예 : localhost : 3000/tests)

두 곳에서 상대 URL을 사용합니다.

  1. 경로 처리기에서 res.redirect ("foo")를 수행 할 수 있습니다. 따라서 수신 URL이 이고 example.com/myapp/tests/ 인 경우 example.com/myapp/tests/foo라는 URL로 리디렉션됩니다. 들어오는 URL이 example.com/myapp/tests 인 경우 example.com/myapp/foo로 리디렉션됩니다. 나는 첫 번째가 아니라 두 번째 것을 원한다.

  2. 내가 생성 (EJS로 렌더링) 한 HTML 페이지에는 CSS와 HTML 폼, 링크, 버튼이 포함되어 있습니다. 그래서 CSS 같은 것을 포함 들어오는 URL에 후행가

    링크 HREF = "스타일 시트/my.css"확인해 = "스타일 시트">

이런 것들에 대한 경로를 슬래시 경우 잘못 해결 모든 현재 페이지를 기준으로 하지만 브라우저의 위치 상자에 example.com/myapp/tests/ 과 같은 페이지가 표시되는 경우 example.com/myapp/tests 인 경우와 다른 URL이 표시됩니다. 전자의 경우 CSS는 /stylesheets/my.css가 아닌 /tests/stylessheets/my.css에서 찾고 있기 때문에 찾을 수 없습니다. 마찬가지로이 상대 URL은 다른 두 개의 수신 URL로이 페이지를 효과적으로 생성 할 수 있기 때문에 다르게 해결됩니다.

+0

내 응용 프로그램에서 '/ tests/hello'와 같은 절대 경로를 사용하면 아무런 문제없이 상대 경로가 필요합니까? 상대 경로에 문제가있는 곳을 보여줄 수 있습니까? – Molda

답변

0

후행 슬래시 뒤에 아무 것도없는 URL은 후행 슬래시가없는 URL과 같습니다. 예를 들어, /tests/newtests.jsapp를 사용하지 않을 경우 아무것도하지 않습니다 경로를 포함, 코드에서

/tests/new/과 동일합니다.

코드에서 /tests으로 사용하면 /tests의 경우 tests.js에 정의 된 경로가 사용됩니다.이것은 tests.js 파일에 정의 된 모든 경로가 /tests 때문에 이후에 추가되는 것을 의미합니다 : 당신이 별도로/새로운 경로를 원하는 경우에

app.use("/tests", tests); 

, 당신은 다음을 수행 할 수 있습니다.

  1. 다른 파일에 /new 경로를 정의하고
  2. app.use("/", newRoute); 자체가 경로를 정의 할. (나는 이것을하지 않는 것이 좋습니다 있지만 그것은 당신의 코드를 혼란 것 같은)
+0

내 앱이/tests /와 같은 경로를 사용하고 있지 않지만 누군가가 위치 상자에 직접 해당 URL을 입력하면 요청이 전송되고 처리기가이를 수신하여 처리하고 상대 URL을 엉망으로 만듭니다. 다른 경로에 대한 다른 js 파일이 테스트 옆에 있습니다. 예제에서, 나의 욕망은 다른 곳이 아닌 routes/tests/new inside tests.js를 처리하는 것입니다. – dam

0

짧은 답변 :

.use("/tests", tests); 

Use이 미들웨어를 정의하는 모든 노선을 의미 :이 라인 tests을 통해 모든 라우팅된다 그것을 통과하십시오.

관련 문제