2017-05-09 68 views
1

當我打我的api時,我想將我的url從https://myapp.herokuapp.com/token/aaa.bbb.ccc重定向到https://myapp.herokuapp.com/messages/:id。我也想使我message觀點使用Express重定向和渲染

代碼:

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的看法,但對於下面的API的網址仍然是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.redirect('/messages/'+message._id) 
    }) 
}) 

現在,網址是https://myapp.herokuapp.com/messages/:id,但message視圖不呈現。呈現JSON將顯示消息

如何重定向到https://myapp.herokuapp.com/messages/:id並呈現message視圖?

+0

通過直接的瀏覽器請求或通過XHR(「AJAX」)請求獲得'/ token /:id'是否被請求? – 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。您可以添加一個檢查,看看是否請求是一個XHR請求或沒有,要麼返回JSON(用於XHR)或呈現模板(非XHR):

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

documentation for req.xhr,要知道,它基於的方法並非萬無一失)

但是,也許最好使用內容協商,其中客戶端明確地告訴服務器響應應該是什麼格式。這樣做的好處是它更加明確,缺點是你可能不得不改變一些客戶端代碼。這裏的文檔:http://expressjs.com/en/4x/api.html#res.format

+0

感謝它的精美 – user2456977