如何在解析器中设置字段参数



我在限制我的 graphql 端点以仅提供允许请求用户请求的数据时遇到问题

我正在使用

apollo-server 2.1.0
express 4.16.3
graphql 0.13.2
graphql-tools 4.0.0
neo4j-graphql-js 0.2.1

Tag类型具有一个字段元素,该元素应仅包含当前用户拥有的元素

type Tag {
name: String!
elements(username:String): [Element] @cypher(statement: "MATCH (this)-[:TAGGED]-(e:Element)-[:OWNER]-(u:User) WHERE u.name=$username RETURN e")
}
type Element {
uuid: String!
name: String
users: [User] @relation(name:"OWNER", direction:"IN")
tags: [Tag] @relation(name:"TAGGED", direction:"IN")
responses: [Element] @relation(name:"RESPONSE", direction:"OUT")
}

当我的查询如下所示时:

{
Tag{
name,
elements(username:"crmue"){
name
}
}
}

结果看起来符合预期。但是我想根据上下文附加的用户在解析器中检查并设置用户名参数。

但是,当我在执行查询之前将以下行添加到 Tag 根解析程序时,我的响应为空。

params['username'] = ctx.user.name;

在这种情况下,生成的密码语句将用户名 agrument 放置到根标记部分,而不是子元素(@cypher语句(部分。但是我不知道如何在获取数据之前为解析器中的 Tag 字段元素设置 username 参数。

因此,我希望有人可能知道如何解决我的问题,或者比我在这里的解决方案有更好的想法@cypher声明。

谢谢!

更新

我目前的基本解析器是:

export const resolvers = {
Tag : {
elements : (object, params, ctx, resolveInfo) => {
params["username"] = ctx.user.name;
}
},
Query: {
User(object, params, ctx, resolveInfo) {
return neo4jgraphql(object, params, ctx, resolveInfo);
},
Element(object, params, ctx, resolveInfo) {
return neo4jgraphql(object, params, ctx, resolveInfo);
},
Tag(object, params, ctx, resolveInfo) {
if(!ctx.user){
throw Error("Wrong request");
}
params["username"] = ctx.user.name;
return neo4jgraphql(object, params, ctx, resolveInfo); 
},
}
};

在"元素"字段解析器中添加参数不起作用,因为字段解析器是在获取数据时调用的。

通常根解析器不返回整个对象,只返回"自己的字段",将相关字段留给字段解析器处理。在这种情况下,看起来neo4jgraphql(我猜,我没有使用它(足够聪明,可以完全在根级别处理它。

如果Tag中的params["username"] = ctx.user.name;不起作用,那么看起来neo4jgraphql不关心params(恕我直言,它应该 - 问题? (并直接处理解析器info参数(已经存在的变量(。

尝试将username添加到数组variableValues。解释 在这种情况下,不需要字段解析程序。

第二种选择:从fieldNodes中删除elements(在Tag解析器中(并使用字段解析器(params/variableValues(。

如果仍然有问题,请检查/记录info状态/值。

最新更新