我正在尝试将指令添加到我们的GraphQL API中,并遵循此示例https://www.apollographql.com/docs/apollo-server/features/creating-directives.html#Uppercasing-strings,但是,我不断收到服务器错误(没有该指令,服务器就可以工作!):</ p>
** Uncaught Error: Duplicate schema type name Integer **
at home/node_modules/apollo-server-core/node_modules/graphql-tools/dist/schemaVisitor.js:243:27
at home/node_modules/apollo-server-core/node_modules/graphql-tools/dist/schemaVisitor.js:527:9
at Array.forEach (<anonymous>)
at each (home/node_modules/apollo-server-core/node_modules/graphql-tools/dist/schemaVisitor.js:526:32)
at heal (home/node_modules/apollo-server-core/node_modules/graphql-tools/dist/schemaVisitor.js:234:13)
at healSchema (home/node_modules/apollo-server-core/node_modules/graphql-tools/dist/schemaVisitor.js:225:5)
at Function.SchemaDirectiveVisitor.visitSchemaDirectives (home/node_modules/apollo-server-core/node_modules/graphql-tools/dist/schemaVisitor.js:474:9)
at Object.makeExecutableSchema (home/node_modules/apollo-server-core/node_modules/graphql-tools/dist/makeExecutableSchema.js:54:48)
at new ApolloServerBase (home/node_modules/apollo-server-core/dist/ApolloServer.js:142:43)
at new ApolloServer (home/node_modules/apollo-server-express/dist/ApolloServer.js:44:1)
模式非常大,因此无法在此处发布,但是,模式类型'Integer'尚未重复。我遵循了多种不同的指南,但一直遇到此错误。
我们正在使用Apollo Server 2.1.0和GraphQL 14.0.2
服务器设置:
class error_extension extends GraphQLExtension {
willSendResponse(o) {
const { context, graphqlResponse } = o;
context.add_additional_error_reporting(graphqlResponse.errors);
return o;
}
}
// Create (or import) a custom schema directive
class UpperCaseDirective extends SchemaDirectiveVisitor {
visitFieldDefinition(field) {
const { resolve = defaultFieldResolver } = field;
field.resolve = async function (...args) {
const result = await resolve.apply(this, args);
if (typeof result === 'string') {
return result.toUpperCase();
}
return result;
};
}
}
// Server settings
const server = new ApolloServer({
typeDefs,
resolvers,
schemaDirectives: {
upper: UpperCaseDirective,
},
context: async ({ req, res }) => {
// some auth logic here - removed for the purpose of this
return {
add_additional_error_reporting(errors) {
if (!errors) return;
errors = errors.map(item => {
// add request data to the returned error
if (`extensions` in item && item.extensions !== undefined)
item.extensions.request_details = req.body;
return item;
});
return errors;
},
req,
res
};
},
extensions: [() => new error_extension()],
validationRules: [
depthLimit(5),
costAnalysis({ // GraphQL Query Cost
maximumCost: 100, // maximum cost of a single query
defaultCost: 1, // default cost of a field
onComplete: (async request_cost => {
// Callback function to retrieve the determined query cost. It will be invoked whether the query is rejected or not.
// This can be used for logging or to implement rate limiting (for example, to store the cost by session and define a max cost the user can have in a specific time).
try {
cost_data = await helper.run_connector_cost_logic(request_cost);
} catch (err) { throw err; }
}),
createError: (maximumCost, cost) => {
// Function to create a custom error
throw new ApolloError(`The maximum cost per request is ${maximumCost} however this request is greater than this limit, with a cost of ${cost}.`, `EXCEEDED_MAX_REQ_COST`);
}
})
],
formatError: err => {
console.error(err); // eslint-disable-line
return err;
},
formatResponse: res => {
res.extensions.cost = cost_data;
// wipe the cost data for the next request
cost_data = {};
return res;
},
introspection: false,
tracing: false,
debug: false
});
任何帮助将不胜感激!
答案 0 :(得分:0)
这是使用JS逻辑生成的Scalars的一个问题,但是有一条语句存在缺陷,导致多个具有相同名称值的Scalars。
对于其他任何人,如@Daniel Rearden在评论中所说:“错误来自graphql-tools。除非您包含指令,否则不会调用该验证逻辑”,因此,为什么错误只是在这里出现,即与指令无关。