gpt4 book ai didi

graphql - 使用 graphql-tools 来模拟 GraphQL 服务器似乎坏了

转载 作者:行者123 更新时间:2023-12-03 18:02:54 28 4
gpt4 key购买 nike

我已关注 the documentation about using graphql-tools to mock a GraphQL server ,但是这会引发自定义类型的错误,例如:

Expected a value of type "JSON" but received: [object Object]

关于模拟的 graphql-tools 文档明确声明它们支持自定义类型,甚至提供了使用来自 graphql-type-json 项目的 GraphQLJSON 自定义类型的示例。

我已提供 a demo of a solution on github它使用 graphql-tools 成功模拟 GraphQL 服务器,但这依赖于对构建的架构进行猴子修补:
// Here we Monkey-patch the schema, as otherwise it will fall back
// to the default serialize which simply returns null.
schema._typeMap.JSON._scalarConfig.serialize = () => {
return { result: 'mocking JSON monkey-patched' }
}

schema._typeMap.MyCustomScalar._scalarConfig.serialize = () => {
return mocks.MyCustomScalar()
}

可能我在演示中做错了什么,但是如果没有上面的猴子补丁代码,我会收到关于上面提到的自定义类型的错误。

有没有人有比我的演示更好的解决方案,或者任何关于我可能做错了什么的线索,以及我如何更改代码以便演示在不修补模式的情况下工作?

演示中的相关代码 index.js如下:
/*
** As per:
** http://dev.apollodata.com/tools/graphql-tools/mocking.html
** Note that there are references on the web to graphql-tools.mockServer,
** but these seem to be out of date.
*/

const { graphql, GraphQLScalarType } = require('graphql');
const { makeExecutableSchema, addMockFunctionsToSchema } = require('graphql-tools');
const GraphQLJSON = require('graphql-type-json');

const myCustomScalarType = new GraphQLScalarType({
name: 'MyCustomScalar',
description: 'Description of my custom scalar type',
serialize(value) {
let result;
// Implement your own behavior here by setting the 'result' variable
result = value || "I am the results of myCustomScalarType.serialize";
return result;
},
parseValue(value) {
let result;
// Implement your own behavior here by setting the 'result' variable
result = value || "I am the results of myCustomScalarType.parseValue";
return result;
},
parseLiteral(ast) {
switch (ast.kind) {
// Implement your own behavior here by returning what suits your needs
// depending on ast.kind
}
}
});

const schemaString = `
scalar MyCustomScalar
scalar JSON

type Foo {
aField: MyCustomScalar
bField: JSON
cField: String
}

type Query {
foo: Foo
}
`;
const resolverFunctions = {
Query: {
foo: {
aField: () => {
return 'I am the result of resolverFunctions.Query.foo.aField'
},
bField: () => ({ result: 'of resolverFunctions.Query.foo.bField' }),
cField: () => {
return 'I am the result of resolverFunctions.Query.foo.cField'
}
},
},
};

const mocks = {
Foo: () => ({
// aField: () => mocks.MyCustomScalar(),
// bField: () => ({ result: 'of mocks.foo.bField' }),
cField: () => {
return 'I am the result of mocks.foo.cField'
}
}),

cField: () => {
return 'mocking cField'
},

MyCustomScalar: () => {
return 'mocking MyCustomScalar'
},

JSON: () => {
return { result: 'mocking JSON'}
}
}

const query = `
{
foo {
aField
bField
cField
}
}
`;

const schema = makeExecutableSchema({
typeDefs: schemaString,
resolvers: resolverFunctions
})

addMockFunctionsToSchema({
schema,
mocks
});

// Here we Monkey-patch the schema, as otherwise it will fall back
// to the default serialize which simply returns null.
schema._typeMap.JSON._scalarConfig.serialize = () => {
return { result: 'mocking JSON monkey-patched' }
}

schema._typeMap.MyCustomScalar._scalarConfig.serialize = () => {
return mocks.MyCustomScalar()
}

graphql(schema, query).then((result) => console.log('Got result', JSON.stringify(result, null, 4)));

最佳答案

我和其他一些人在实时数据源(在我的情况下是 MongoDB/Mongoose)看到了类似的问题。我怀疑它是 graphql-tools makeExecutableSchema 及其使用自定义类型摄取基于文本的模式的内部的东西。

这是关于这个问题的另一篇文章:How to use graphql-type-json package with GraphQl

我还没有尝试过在代码中构建架构的建议,所以无法确认它是否有效。

我目前的解决方法是在将 JSON 字段(在连接器中)提供给客户端(并在客户端解析)时对它们进行字符串化,反之亦然。有点笨拙,但我并没有真正使用 GraphQL 来查询和/或有选择地提取 JSON 对象中的属性。对于我怀疑的大型 JSON 对象,这不是最佳选择。

关于graphql - 使用 graphql-tools 来模拟 GraphQL 服务器似乎坏了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42854797/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com