Apollo Server中自定义GraphQL指令参数无法解析怎么办?
在用Apollo Server搭建GraphQL接口时,我定义了一个带参数的@auth指令,但运行时参数总是undefined。
场景是这样的:在查询字段上加了@auth(roles:[“admin”]),按照文档应该能获取到roles参数。我尝试过在schema直接定义:
directive @auth(roles: [String!]!) on FIELD_DEFINITION
然后在解析函数里用:
async function resolveAuth(_, __, ___,{ args }) {
console.log(args.roles); // 输出undefined
return true;
}
但参数就是取不到,控制台还报了这个警告:"Unknown argument "roles" on field"。是不是指令参数需要额外注册?或者解析顺序哪里有问题?
先说解决办法,可以试试这样改:
1. **先确保你的指令定义是这样的**:
2. **在解析函数里取参数的方式改成这样**:
注意,指令解析函数的参数结构和普通 resolver 不一样,它用的是
(next, source, args, context, info)这一组参数,args是直接传进来的参数对象。3. **在 schema 里注册指令的时候要加上参数解析**:
另外,如果你是用
schemaDirectives的方式来注册指令的,就不要在 resolver 里写resolveAuth这个名字重复的字段了,不然会冲突。我之前也因为参数结构搞错,或者指令没注册对,卡了好久。你可以先按这个方式改一下看看,应该能拿到 roles 参数了。如果还报错,可以贴下你的 schema 和注册部分代码,我帮你看看。
args并不是通过第四个参数来拿的,而是需要从directiveArgs中提取。通用的做法是这样:首先确保你的指令定义没错,这部分你已经做了:
然后重点来了,解析函数要改成下面这种形式:
注意看,
directiveArgs是单独的一个参数,放在最后,专门用来接收指令里的参数。你之前的写法用args是不对的,因为args是用来接收字段本身的参数的,和指令参数没关系。还有个坑就是警告“Unknown argument”,这通常是因为Schema Stitching或者某些配置问题导致的。如果你用了合并Schema之类的操作,记得检查一下是否正确注册了指令。
试试这个方法,应该就能解决了。要是还报错,可能就得看看是不是其他地方配置有问题了。