首页 > 解决方案 > 根据服务器模式验证 React GraphQL 标签

问题描述

我想根据我们的 graphql 服务器上生成的模式来验证我们的 react 客户端上的 graphql 标签。此验证将作为我们测试设置的一部分运行,并在 graphql 模式定义中出现重大更改时向我们发出警告。

到目前为止,我已经使用从服务器中提取了 schema.jsonapollo schema:download --endpoint=http...

现在我想测试以下突变:

import gql from 'graphql-tag';

const LOGIN_MUTATION = gql`
    mutation LoginMutation($email: String!, $password: String!) {
        login(email: $email, password: $password) {
            id
            accessToken
            refreshToken
            expires
        }
    }
`;

通过这样的测试:

import { GraphQLSchema } from 'graphql';
import { validate } from 'graphql/validation';
import * as schemaJson from '../../../../../backend/schema.json';
const schema = new GraphQLSchema(schemaJson as any);
import { LOGIN_MUTATION } from './Auth';

test("validate login mutation", assert => {
    const errors = validate(schema, LOGIN_MUTATION);
    const isValid = !errors.length;
    expect(isValid).toBe(true);
});

这给了我错误:Query root type must be provided

如何根据给定的 json 模式验证 graphql 标记?

标签: reactjsgraphqlapollo

解决方案


apollo schema:download命令对服务器运行自省查询,并为您提供该查询的 JSON 结果。您不能获取此 JSON 并将其直接传递给GraphQLSchema构造函数 - 初始化该类的正确方法显示在 docs 中。但是,您可以使用以下buildClientSchema功能:

给定客户端运行自省查询的结果,创建并返回一个 GraphQLSchema 实例,然后该实例可以与所有 GraphQL.js 工具一起使用,但不能用于执行查询,因为自省并不代表“解析器”、“解析器” ”或“序列化”函数或任何其他服务器内部机制。

把它们放在一起:

const gql = require('graphql-tag')
const { validate, buildClientSchema } = require('graphql')
const schema = buildClientSchema(introspectionResult)
const document = gql`{
  someQuery
}`
const errorArray = validate(schema, document)

推荐阅读