【问题标题】:res.render() and res.redirect() behave like res.send()res.render() 和 res.redirect() 的行为类似于 res.send()
【发布时间】:2017-07-12 01:50:27
【问题描述】:

我正在尝试使用fetch 进行简单的发布请求:

const headers = new Headers({
  Accept: 'application/json',
  'Content-Type': 'application/json',
});

fetch('/checkout/billing', {
        headers,
        body,
        credentials: 'include',
        method: 'POST',
      })
      .catch(console.error);

并且服务器端端点看起来像:

if (!validateResult) {
        res.redirect('/checkout/shipping');
      } else {
        view.render('checkout/billing')
      }

因此,当我使用常规 HTML 表单提交时,它可以正常工作(重定向或呈现),但是当我使用 fetch 而不是重定向或呈现时,我会收到 HTML 正文作为响应,就像我会使用 @987654325 @,知道什么会导致这个问题吗?

【问题讨论】:

  • 您的路径checkout/billing 解析为什么?如果是html,那么你得到的是正常的
  • view.render('checkout/billing')?它是 html 模板的路径,但它不应该将 html 作为响应返回给我,它应该呈现该页面
  • 你所谓的渲染页面实际上是将html发送到客户端(你的浏览器)以便它可以渲染。所以是的,它应该返回 html。我会尝试在答案中澄清:)
  • 好的,我会试着澄清我的问题)当我使用 html 提交时,它会做它应该做的事情,发送 post 请求,接收 html 正文并自动呈现页面,或重定向到页面(如果res.redirect()),但现在它只是发送原始html作为响应

标签: javascript html node.js ajax fetch


【解决方案1】:

TL;DR:它应该向您发送 HTMLper spec


您希望客户端提供 JSON,但您要求提供呈现 HTML 的路径,这就是您获得 HTML 的原因。

render 这个词可能有点令人困惑:它来自于你有一个模板(可能是 html / pug / mustache / ...),你的服务器将转换为 html .但最终,当您渲染时,服务器所做的只是发送最终的 HTML 作为对客户端请求的响应。

因此,如果请求是针对 HTML 中的视图,这将按预期工作。但是如果你想做一个 AJAX 请求,那么你就会遇到这种奇怪的行为。

【讨论】:

  • 感谢您的解释,那么我应该使用什么来代替Accept: 'application/json'
  • 我不知道您的整个应用程序,如果您的目标是重定向,您可以接受任何内容,并在您的请求回调时重定向。或者,如果您的应用程序位于 SPA 中,那么您应该从服务器发送 JSON 并使用 javascript 在前端处理您的更改。
猜你喜欢
  • 2016-06-13
  • 1970-01-01
  • 2020-05-21
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多