【问题标题】:All Inertia requests must receive a valid Inertia response, however a plain JSON response was received所有 Inertia 请求都必须收到有效的 Inertia 响应,但是收到的是纯 JSON 响应
【发布时间】:2021-04-08 15:43:46
【问题描述】:

我正在尝试理解和解决这个 InertiaJs 错误但没有成功,我希望我能在这里得到一些帮助。

【问题讨论】:

  • 欢迎来到 SO ...您如何从服务器返回此响应?
  • 请您显示您用于提交请求的代码以及返回响应的路由/控制器代码。
  • 使用axios或者ajax响应是正确的。但是使用惯性,客户端将等待惯性响应。也在寻找一些解决方案。
  • @lagbox 是的,我来自 laravel 控制器,在这里查看我的问题:stackoverflow.com/questions/68327441/…

标签: laravel vue.js jetstream inertiajs


【解决方案1】:

你可以这样做

axios.get("http://example.com",).then((res) => {
   console.log(res.data)
})

【讨论】:

  • 不工作,继续收到此作为响应:{ "cookies": {}, "transferStats": {} }
【解决方案2】:

也许你正在使用 this.$inertia,它等待 Inertia 响应;

this.$inertia.get(route('example'))
  .then(res => {
     console.log(res)
  })

请使用 axios。而是

axios.get(route('example'))
  .then(res => {
     console.log(res)
  })

【讨论】:

    【解决方案3】:

    如果你使用 Laravel Jetstream 和 Inertia 前端托管在一个域上,另一个域托管你的 Laravel 后端,那么 CORS 可能与这种行为有关。

    在查看了 innertia.js 的代码后,我遇到了同样的问题, 我发现了这个,它可以触发模态,它正在响应的标题中寻找“x-inertia”:

    isInertiaResponse(response) {
        return response?.headers['x-inertia']
    }
    

    响应的标头中已经存在(如果您使用 Inertia::render):

    X-Inertia: true
    

    只有浏览器不会将此标头提供给 javascript,出于安全原因,这是由您的浏览器完成的。

    您可以尝试将其添加到您的 config/cors.php 中:

    'exposed_headers' => ['x-inertia']
    

    如果您使用浏览器的网络检查器,您将在响应中看到添加的标题:

    Access-Control-Expose-Headers: x-inertia
    

    基于此标头,浏览器将使“X-Inertia”标头可用于 javascript(并且弹出窗口将消失)。

    考虑到 CORS 是一种安全措施,以这种方式添加内容可能会带来安全风险,尤其是在使用通配符而不是定义的值时,为了完整并使此示例正常工作,config/cors.php 也需要这个:

    'allowed_origins' => ['your-frontend.domain'],
    'paths' => [ '/path-you-are-requesting' ],
    'allowed_methods' => [ 'GET' ]
    'allowed_headers' => [ 'content-type,x-inertia,x-inertia-version,x-requested-with' ]
    

    【讨论】:

    • 不想返回新视图怎么办?
    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多