【问题标题】:How to render to new HTML page on success of API fetch request in NodeJs?如何在 NodeJs 中的 API 获取请求成功时呈现到新的 HTML 页面?
【发布时间】:2019-04-22 06:25:37
【问题描述】:

我想根据用户请求呈现一个新的 HTML 页面,该页面只有在 authorization 标头设置正确的情况下才能访问。我最初以为浏览器会重定向到该页面,但发现并非如此。我找到了一些方法来处理这个问题,例如替换 DOM,但我认为这不是一个好的解决方案。

这是来自 UI 的 fetch 调用,它返回 HTML,但当前不呈现它:

fetch('/protected_route', {
  headers: {
    'authorization': 'Bearer ' + sessionStorage.getItem('token')
  }
}).then(response => {
  // What to do with the response
});

这是服务器代码,如果有帮助的话:

app.get('/protected_route', (req, res) => {
  const bearer = req.headers['authorization'];

  if(typeof bearer === 'undefined') {
    res.json({message: 'Not logged in'});
  }
  else {
    const token = bearer.split(' ')[1];

    jwt.verify(token, config.secret, (error, data) => {
      if(error) {
        res.json({message: 'Error verifying token'});
      }
      else {
        res.render('protected_route');
      }
    });
  }
});

【问题讨论】:

  • fetch 运行 HTTP 请求,但它旨在与服务器通信 不离开当前页面。既然您是手动处理授权,为什么不使用 cookie 来代替呢?这样您就可以在 /protected_route 处理程序中检查 cookie,然后只需使用 <a> 让用户移动到页面。
  • @ChrisG 感谢您的回答!我实际上没有考虑过这个选项。我刚刚用window.location.href=path 重定向了用户,它现在可以工作了。

标签: javascript html node.js express fetch


【解决方案1】:

我发现解决它的唯一方法是使用 document.write(data)。此语句导致呈现接收到的页面但在同一个文档中,不会将浏览器窗口更改为新页面,并且不会在浏览器的历史记录中包含新的输入

【讨论】:

    【解决方案2】:

    您面临的问题是当您尝试打开一个新的 HTML 页面并通过 res.render() 发回一个 html 文件时,这会将 HTML 内容发送回请求。当通过 AJAX 或 fetch 或 request 或任何其他 API 客户端使用 API 调用时,它们是为单页应用程序开发的,这些调用禁止浏览器呈现到新的 html 页面。来自此类来源的 API 调用处理数据,浏览器无法控制收到的响应。

    如果你需要渲染另一个 HTML 页面而不是使用 form-submit 调用 API,因为这是让浏览器响应响应并在新页面中显示响应的唯一方法。由于res.render()返回了HTML文件内容,因此一个新页面就像一个文件被打开了。

    如果你想使用单页应用程序,那么你必须处理接收到的 HTML,然后用新的 HTML 替换整个加载的 HTML,如果需要使用一些 API 调用模块,你必须在 DOM 中进行更改。

    您可以查看this github project,为初学者解释所有基本的前端和后端链接。

    【讨论】:

    • These response function can only send back data and not html file 明确一点:服务器绝对可以在这里发回一个 HTML 文件,它甚至无法区分 AJAX 请求和常规方式之间的区别。它所做的只是为请求提供端点。完全有可能(毫无意义地)让浏览器导航到 JSON 文件,或者通过 AJAX 请求和处理 HTML 文件。
    • res.render() 所做的是调用视图引擎,提供视图文件和可选参数,然后发回结果文件,通常是 HTML。同样,用res.render() 回复 AJAX 请求是完全可能的,实际上是一个有用的实现。对上述问题的任何回答都必须包括的重要一点是,fetch 不适合使用 JS 以编程方式进行导航。
    • If you need to render another html page than use form-submit to call API as this is the only way that let server render to other page 不,可以使用location.href = url; 导航到其他地方。另外,服务器只提供回复。浏览器是否呈现它取决于请求是如何发出的,而不是取决于服务器端代码使用的命令。
    • 这就是我想说的,这些功能不允许浏览器显示服务器提供的响应并充当中间件来操作数据。而且我们必须在 DOM 中进行更改以反映 HTML 上的更改,并且我们可以使用响应中提供的 HTML 附加、替换旧 HT​​ML。
    • 对不起,您的回答包含几个完全错误的陈述,并且非常具有误导性。在我的书中,它向您展示了如何使用您引用的命令,但您并不真正了解所涉及的过程。 OP 将其标记为已接受,可能没有真正阅读它,但应该编辑或删除 imo。
    猜你喜欢
    • 2019-01-28
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    相关资源
    最近更新 更多