当我点击我的api时,我想将我的网址从https://myapp.herokuapp.com/token/aaa.bbb.ccc
重定向到https://myapp.herokuapp.com/messages/:id
。我还想渲染我的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.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 :(得分: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