在使用applyResolversEnhanceMap时,需要确保装饰器函数在类型定义文件中被声明,并且其名称与resolver中的字段名称相同。
例如,假设我们有一个自定义装饰器函数myDecorator:
import { SchemaDirectiveVisitor } from 'graphql-tools';
export class MyDecoratorDirective extends SchemaDirectiveVisitor {
public visitFieldDefinition(field) {
const { resolve = defaultFieldResolver } = field;
field.resolve = async (...args) => {
const result = await resolve.apply(this, args);
// some logic here
return result;
};
}
}
我们在类型定义文件中使用该装饰器:
directive @myDecorator on FIELD_DEFINITION
type Query {
hello: String @myDecorator
}
我们将该装饰器与resolver函数一起传递给applyResolversEnhanceMap:
import { applyResolversEnhanceMap } from 'type-graphql';
import { MyDecoratorDirective } from './myDecorator';
const resolvers = {
Query: {
hello: async (): Promise => {
return 'world';
},
},
};
const resolversEnhanceMap = {
Query: {
hello: [MyDecoratorDirective],
},
};
applyResolversEnhanceMap(resolvers, resolversEnhanceMap);
现在运行服务器,并查询hello字段,我们将会看到装饰器生效并执行myDecorator函数。