2014-05-24 2 views
1

프로젝트 용 위키 백과 클론을 만들고 있습니다. 내 초기 편집 경로는 다음과 같습니다.req.params를 수집하지 않는 라우팅 문제

router.get('/edit/:id', function(req, res){ 
    var id = req.params.id; 

    console.log(id); 

    models.Page.findById(id, function(err, doc){ 
     console.log(doc); 
     res.render('edit', {page: doc}); 
    }); 

}); 

내가하고있는 일은 id 매개 변수의 ID가 일치하는 페이지에 대한 수정 페이지보기를 만드는 것입니다. 이 때까지 작동 이 ...

나는이 새로운 경로를 추가했다 : 나는 활성이 경로가있을 때 이제

router.get('/:url_name/:id', function(req,res){ 
    var id = req.params.id; 

    models.Page.findById(id, function(err, doc){ 
     res.render('show_page', {page: doc}); 
    }); 
}); 

을 내 편집/: id 매개 변수를 수집하지 않습니다 ID 페이지 경로 (REQ .params.id).

이것이 작동하지 않는 이유와 내가 오류가 발생하지 않아 디버깅을 시작해야하는 곳에서 길을 잃어 버렸습니다. 여전히 편집/ID 페이지로 이동하지만 console.log (id) 나는 값을받지 못한다. 또한 {edit : edit} 뷰에 전달하는 {page : doc}을 (를) 찾을 수 없습니다.

누구든지 통찰력이나 디버그를 시작할 수있는 장소를 제공 할 수 있다면 감사하게 생각합니다. : url_name/: id route가 활성화되어 있지 않으면 edit/: id 라우트가 정상적으로 동작합니다 (req.params.id가 id를 획득).

현재 경로 -

나는 나의 app.js에 var wiki_routes = require('./routes/wiki');을 추가하고 그 길에 내가 가진 : 그들은 코드에서 발생하는

// **** URL ROUTES **** 

router.get('/', function(req, res) { 
    models.Page.find(function(err, docs) { 
    res.render('index', { docs: docs }); 
    }); 
}); 

router.get('/:url_name', function(req, res){ 
    var url_name = req.params.url_name; 
    var isUpdated = req.query.updated; 
    var updated = (isUpdated === 'true')?true:false; 

    models.Page.find({url_name: url_name}, function(err, page){ 
     if(page.length > 1){ 
      console.log(page); 
      res.render('disambiguation', {pages: page, updated: updated }); 

     } else { 
      console.log(page); 
     res.render('show_page', {page: page[0], updated: updated}); 
     } 
    }); 
}); 

router.get('/:url_name/:id', function(req,res){ 
    var id = req.params.id; 

    models.Page.findById(id, function(err, doc){ 
     res.render('show_page', {page: doc}); 
    }); 
}); 

// **** EDIT ROUTES **** 

router.get('/edit/:id', function(req, res){ 
    var id = req.params.id; 

    console.log(id); 

    models.Page.findById(id, function(err, doc){ 
     console.log(doc); 
     res.render('edit', {page: doc}); 
    }); 

}); 

router.post('/edit_submit/:id', function(req, res){ 
    var id = req.params.id; 
    var new_title = req.body.title; 
    var new_body = req.body.body; 

    console.log(req.body); 

    models.Page.findByIdAndUpdate(id, {title: new_title, body: new_body }, function(err, docs){ 
    // redirects to the wiki page 
    res.redirect('/wiki/'+ docs.url_name +'?updated=true'); 
    }); 
}); 

// **** DELETE ROUTE **** 

router.get('/delete/:id', function(req, res){ 
    var id = req.params.id; 

    models.Page.findByIdAndRemove(id, function(err, data){ 
     res.redirect('/?deleted=true'); 
    }); 
}); 
+1

편집 경로 앞에 새로운 경로를 넣었습니까? 모든 경로를 잡으면 – adeneo

+0

안녕하세요, adeneo 님, 경로 편집 전에 '새 경로'가 무슨 뜻인지 잘 모르겠습니다. 여기 내/위키 라우터의 모든 경로가 있습니다. 나는 내 질문에 그것들을 추가했다. – HelloWorld

+1

장소를 바꾸고, 편집 경로를 따라 잡을 수 없도록'edit' 경로 다음에'router.get ('/ : url_name/: id'..')을 움직여 편집하십시오. – adeneo

답변

2

경로가 설정되어, 노드가 presedence을 줄 것으로 어느 경로를 먼저 만나면, 경로를 설정할 때을 많이 주문하십시오. 귀하의 경우 등

말 다른 URL의 많은 수의, 또는 고정 경로를 잡을 변수는

같은

http://example.com/edit/1234

을 보이는 URL을 사용시
URL 잠재적 특히, 여러 경로를 일치 수 그것은 http://example.com/something/something 레이아웃을 일치로 URL이 가장 확실하게이 길

router.get('/:url_name/:id' .... 

에 의해 체포 될 것이고, 그것은 또한 잡힐 것이라고

다음 경로로

router.get('/edit/:id', .... 

으로 표시되며 http://example.com/edit/something 레이아웃과 일치합니다.

URL을 실제로 라우팅하는 경로는 설정시 발생한 순서에 따라 다르며, 먼저 선언 된 경로가 URL을 파악합니다.

그냥 단순히이

처럼 next() 콜백을 사용하여, 주변의 경로를 바꿀 수없는 경우 해결 방법은 대부분의 경우이

// if the URL matches, this will execute first 
router.get('/edit/:id', function(req, res){ 
    // do stuff 
}); 

// You'll only get here if the URL doesn't match the above route 
router.get('/:url_name/:id', function(req, res){ 
    // do stuff 
}); 

같은 문제를 해결할 경로의 순서를 이동

router.get('/:url_name/:id', function(req, res, next){ 

    if (req.params.url_name == 'edit') { 
     next(); // this sends the request back to look for routes below this one 
    }else{ 
     // do stuff 
    } 

}); 

router.get('/edit/:id', function(req, res){ 
    // now we'll get here when the "url_name" is "edit" ... 
});