【问题标题】:Redirect and Render using Express使用 Express 重定向和渲染
【发布时间】:2017-10-07 05:54:21
【问题描述】:

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

如何重定向到 https://myapp.herokuapp.com/messages/:id 并呈现 message 视图?

【问题讨论】:

  • /token/:id 是通过直接浏览器请求还是通过 XHR(“AJAX”)请求获得请求?
  • 实际上只是来自链接<a target="_blank" href="https://myapi.com/token/theID">click the link</a>
  • 谢谢,我不确定我的答案是否有效(当通过 XHR 请求时它不会有效)。 res.json({ error : err }) 在作为常规浏览器请求被请求时有点奇怪,不过,听起来你想在那里呈现一个错误页面。

标签: node.js mongodb express ejs


【解决方案1】:

你应该先重定向:

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

【讨论】:

    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2019-03-01
    • 2020-06-30
    • 1970-01-01
    相关资源
    最近更新 更多