使用Express重定向和渲染

时间:2017-05-09 04:17:39

标签: node.js mongodb express ejs

当我点击我的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视图?

1 个答案:

答案 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