使用 React 进行 GraphQL 查询时 JSON 意外结束,而 GraphiQL 没有问题

Kay*_*een 7 apollo reactjs magento2 graphql

我正在尝试通过 React with Apollo 进行一个非常基本的查询。

当我在 GraphiQL 中执行此查询时,我很好地得到了结果,但在我的应用程序中,我得到了一个未定义的数据对象。并显示错误消息:

网络错误:JSON 输入意外结束

查询是:

query {
    category(id: 3) {
        id
        children {
            id
            name
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的组件

import React, { Component } from 'react';
import { Query } from 'react-apollo';
import gql from 'graphql-tag';

const CATEGORIES_LIST = gql`
    query CATEGORIES_LIST {
        category(id: 3) {
            id
            children {
                id
                name
            }
        }
    }
`;

class Cat extends Component {
    render() {
        return (
            <div>
                <p>Items!</p>
                <Query query={CATEGORIES_LIST}>
                    {payload => {
                        console.log(payload);
                        return <p>fetch done!</p>;
                    }}
                </Query>
            </div>
        )
    }
}

export default Cat;
Run Code Online (Sandbox Code Playgroud)

虽然 GraphiQL 响应具有完全相同的请求

{
  "data": {
    "category": {
      "id": 3,
      "children": [
        {
          "id": 4,
          "name": "Bags"
        },
        {
          "id": 5,
          "name": "Fitness Equipment"
        },
        {
          "id": 6,
          "name": "Watches"
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我正在查询本地 Magento 2.3 graphql 服务器。

检查网络选项卡时,这是我从 graphql 端点得到的响应。因此,响应中没有 url 错字问题

{
   "data":{
      "category":{
         "id":3,
         "children":[
            {
               "id":4,
               "name":"Bags",
               "__typename":"CategoryTree"
            },
            {
               "id":5,
               "name":"Fitness Equipment",
               "__typename":"CategoryTree"
            },
            {
               "id":6,
               "name":"Watches",
               "__typename":"CategoryTree"
            }
         ],
         "__typename":"CategoryTree"
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

Kay*_*een 11

好的,我找到了。

  1. 第一个问题是我no-corsApolloClientwhich上使用了选项,防止它准备好数据,从而发回一个空的数据对象。

  2. 第二个问题是我需要在我的 GraphQL 服务器上正确设置我的 CORS 标头,只是为了开发接受所有带有 * 的 * 在开发阶段解决它。

  3. 第三个也是最后一个问题是 Apollo 发送了一个OPTIONS请求来预检 CORS 标头,看看它是否全部被允许。Magento 2.3 翻转了它,因为它是一个空请求,因此为您提供了一个Unable to unserialize value错误。

我为解决第三个问题所做的是在部署期间临时修补核心文件。需要更改以下文件:/vendor/magento/module-graph-ql/Controller/GraphQl.php

在第 111 行,需要以下内容

 - $data = $this->jsonSerializer->unserialize($request->getContent());
 + $content = ($request->getContent() === '') ? '{}' : $request->getContent();
 + $data = $this->jsonSerializer->unserialize($content);
Run Code Online (Sandbox Code Playgroud)

我认为在 React / Apollo 方面还有其他解决方案,但还没有找到。