使用Expressredirect和渲染

当我打我的API,我想redirect我的url从https://myapp.herokuapp.com/token/aaa.bbb.ccchttps://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/:idmessage视图不会呈现。 呈现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