2017-05-09 4 views
1

내 API를 누르시면 https://myapp.herokuapp.com/token/aaa.bbb.ccc에서 https://myapp.herokuapp.com/messages/:id으로 내 URL을 리디렉션하고 싶습니다. 나는 성공적으로 내 message보기를 렌더링하지만, 아래 API의 URL은 여전히 ​​https://myapp.herokuapp.com/token/aaa.bbb.ccc하지 https://myapp.herokuapp.com/messages/:id리디렉션 및 익스프레스를 사용하여 렌더링

또 다른 시도이다, 여기에

app.get('/token/:id' , (req, res) => { 
    var decoded = jwt.verify(req.params.id, 'blabla'); 
    Message.findById(decoded.messageId, (err, message) => { 
    if (err) res.json({error: err}) 
    res.render('message', {message}) 
    }) 
}) 

: 나는 또한 내 message보기

코드를 렌더링 할

app.get('/token/:id' , (req, res) => { 
    var decoded = jwt.verify(req.params.id, 'blabla'); 

    Message.findById(decoded.messageId, (err, message) => { 
    if (err) res.json({error: err}) 
    res.redirect('/messages/'+message._id) 
    }) 
}) 

이제 URL은 https://myapp.herokuapp.com/messages/:id이지만 message 뷰가 렌더링되지 않습니다.

https://myapp.herokuapp.com/messages/:id으로 리디렉션하고 message보기를 렌더링하는 방법은 무엇입니까?

+0

'/ token/: id'는 직접 브라우저 요청이나 XHR ("AJAX") 요청을 통해 요청을 받습니까? – robertklep

+0

그대로 링크에서'click the link' – user2456977

+0

고마워, 내 대답은 작동하지 않을 경우 (XHR을 통해 요청 될 때 안). 'res.json ({error : err})'은 일반적인 브라우저 요청으로 요청 될 때 조금 이상합니다. 그러나 오류 페이지를 렌더링하려는 것처럼 들립니다. – robertklep

답변

3

먼저 리디렉션해야합니다

app.get('/token/:id' , (req, res) => { 
    var decoded = jwt.verify(req.params.id, 'blabla'); 

    Message.findById(decoded.messageId, (err, message) => { 
    if (err) return res.json({error: err}); // see @partycoder's answer 
    res.redirect('/messages/'+message._id) 
    }) 
}) 

다음, 당신은 /messages/:id에 대한 경로 처리기를 조정해야합니다. 지금은 XHR 요청에만 사용되는 것처럼 들리므로 항상 JSON을 반환합니다.

app.get('/messages/:id', (req, res) => { 
    ... 
    if (req.xhr) { 
    return res.json(...); 
    } else { 
    return res.render(...); 
    } 
}); 

(documentation for req.xhr 알고 있어야 : 요청 (비 XHR의 경우) XHR 요청 여부 및 (XHR에 대한) 중 하나를 반환 JSON 또는 렌더링 템플릿 인 경우 확인하기 위해 검사를 추가 할 수 있습니다 이것이 기반으로하는 방법은 절대적이지 않습니다.)

그러나 클라이언트가 명시 적으로 응답 형식을 서버에 명시하는 경우 콘텐츠 협상을 사용하는 것이 좋습니다. 이것의 장점은 훨씬 더 명확하다는 것입니다. 단점은 클라이언트 측 코드를 변경해야한다는 것입니다. 여기에 문서 : http://expressjs.com/en/4x/api.html#res.format

+0

감사합니다. 아름답게 작동합니다. – user2456977