从apollo-server-express导入SchemaDirectiveVisitor报错如何解决
报错根因
你触发该报错的核心原因是当前使用的apollo-server-express为v3及以上版本,该版本已经彻底移除了内置的SchemaDirectiveVisitor导出,你代码中解构得到的SchemaDirectiveVisitor为undefined,继承undefined时就会抛出该类型错误。
解决方案
有两种可选处理方式:
方案1:降级到兼容的旧版本
如果不需要使用新版Apollo Server的特性,可以直接降级到v2版本,原有代码无需任何修改即可正常运行:
- 执行安装命令:
npm install apollo-server-express@2.x
方案2:适配v3及以上版本(推荐)
v2版本已经停止维护,建议改用新版Apollo Server官方推荐的自定义指令实现方式,步骤如下:
- 安装所需依赖:
npm install @graphql-tools/schema @graphql-tools/utils - 替换原有自定义指令的实现逻辑,示例代码如下:
const { mapSchema, getDirective, MapperKind } = require('@graphql-tools/utils'); const { makeExecutableSchema } = require('@graphql-tools/schema'); // 自定义replace指令的转换逻辑 const replaceDirectiveTransformer = (schema, directiveName = 'replace') => { return mapSchema(schema, { [MapperKind.FIELD]: (fieldConfig) => { const directive = getDirective(schema, fieldConfig, directiveName)?.[0]; if (directive) { const { replacement } = directive; // 重写字段的resolve方法 fieldConfig.resolve = () => replacement; return fieldConfig; } } }); }; // 构造可执行schema const typeDefs = ` # 先声明自定义指令 directive @replace(replacement: String!) on FIELD_DEFINITION # 此处补充你其余的类型定义代码 `; const resolvers = { // 此处补充你其余的resolver代码 }; let executableSchema = makeExecutableSchema({ typeDefs, resolvers }); // 应用自定义指令转换 executableSchema = replaceDirectiveTransformer(executableSchema);
后续将转换后的executableSchema传入ApolloServer的构造参数即可正常使用。
内容的提问来源于stack exchange,提问作者Vipul
相关产品推荐
相关产品推荐

