使用Expressredirect和渲染
当我打我的API,我想redirect我的url从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的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.redirect('/messages/'+message._id) }) })
现在,该URL是https://myapp.herokuapp.com/messages/:id
但message
视图不会呈现。 呈现JSON以显示消息
如何redirect到https://myapp.herokuapp.com/messages/:id
并呈现message
视图?
你应该首先redirect:
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(...); } });
( req.xhr
文档 ,请注意,这是基于这种方法是不是万无一失)
但是,也许最好使用内容协商,客户端明确地告诉服务器响应应该是什么格式。 这样做的好处是它更加明确,缺点是你可能不得不改变一些客户端代码。 文档在这里: http : //expressjs.com/en/4x/api.html#res.format