0

我是在 React 中使用 GraphQL 的新手,并且一直在将一个项目从 REST API 转移到一个新的 GraphQL 中。作为其中的一部分,我想设置模拟数据以独立于正在完成的 GQL API 在应用程序上工作。我花了很多时间尝试遵循 Apollo 和GraphQL 工具文档,但无论如何,我似乎无法让模拟解析器正常工作。对于上下文,我在 NextJS/React 应用程序中使用它,这是我正在尝试做的最小示例:

设置 App.js

import React from 'react';
import ApolloClient from 'apollo-client';
import { ApolloProvider } from 'react-apollo';
import { SchemaLink } from 'apollo-link-schema';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { makeExecutableSchema } from '@graphql-tools/schema';
import { addMocksToSchema } from '@graphql-tools/mock';

export default function App() {
    const schema = makeExecutableSchema({typeDefs:`
        type Query {
            getPerson: Person!
        }
                
        type Person {
            name: String!
        }
    `});

    const mocks = {
        Query: () => ({
            getPerson: () => ({
                name: () => "Name"
            })
        })
    }

    addMocksToSchema({ mocks, schema });
    const link = new SchemaLink({ schema });
    const client = new ApolloClient({
        link,
        cache: new InMemoryCache(),
        connectToDevTools: true
    });

    return (
        <ApolloProvider client={client}>
            <Person />
        </ApolloProvider>
    )
}

人.js

import React from 'react';
import { useQuery } from '@apollo/react-hooks';
import gql from 'graphql-tag';

export default function Person() {
    const { loading, error, data } = useQuery(gql`
        query PersonQuery {
            getPerson {
                name
            }
        }
    `, {
        errorPolicy: 'all'
    });

    console.log(data);

    if (loading) return "Loading...";
    if (error) console.log(error);

    return (
        <h1>{data.getPerson.name}<h1>
    )
}

查看 console.log(error) 结果会产生错误Cannot return null for non-nullable field Query.getPerson并使其成为可为空的字段{ getPerson: null }当然只是返回。我尝试将解析器结果作为对象与函数返回。在解析器中记录显示查询部分正在执行,但其中没有嵌套任何内容。

我是否设置不正确?我还尝试不按照基于 graphql-tools 文档的建议传递自定义模拟,但无济于事。我还在 apollo hooks GitHub 上看到了这个问题,说最新版本的 hooks 破坏了 addMocksToSchema 的使用,所以我尝试使用建议的 3.1.3 版本,但还是没有运气。任何帮助将不胜感激!

4

1 回答 1

1

您需要向客户端提供模拟,而不是普通模式。

const schemaWithMocks = addMocksToSchema({
  schema,
  mocks: {},
  preserveResolvers: false,
});

const client = new ApolloClient({
  // link: new SchemaLink({ schema }); < -- REPLACE THIS
  link: (new SchemaLink({ schema: schemaWithMocks }) as unknown) as ApolloLink, // https://github.com/apollographql/apollo-link/issues/1258
  cache: new InMemoryCache(),
  connectToDevTools: true,
});

现在console.log(data)打印 {"getPerson": {"__typename": "Person", "name": "Name"}}

于 2020-11-27T14:08:15.163 回答