如何在解析器中设置字段参数
How to set a field parameter inside resolver
我无法将我的 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 有一个字段 elements,它应该只包含当前用户拥有的元素。
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
}
}
}
结果符合预期。但我想根据上下文附加用户检查并设置解析器中的用户名参数。
但是当我在执行查询之前将以下行添加到标签根解析器时,我的响应是空的。
params['username'] = ctx.user.name;
在这种情况下,生成的密码语句将用户名添加到根标记部分而不是子元素(@cypher 语句)部分。但是我不知道如何在获取数据之前为解析器中的 Tag 字段元素设置用户名参数。
所以我希望有人可能知道如何解决我的问题,或者有比我在这里使用@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);
},
}
};
在 'elements' 字段解析器中添加参数没有任何效果,因为字段解析器是在数据已获取时调用的。
通常根解析器不会 return 整个对象,只会 'own fields' 留下相关字段由字段解析器处理。在这种情况下,看起来 neo4jgraphql
(我猜,我没有使用它)足够聪明,可以完全在根级别处理它。
如果 Tag
中的 params["username"] = ctx.user.name;
不起作用,那么看起来 neo4jgraphql
不关心 params
(恕我直言,它应该 - 问题?)并且有效直接在解析器 info
参数上(已经存在的变量)。
尝试将 username
添加到 variableValues
数组中。 Explanations
在这种情况下不需要字段解析器。
第二个选项:从 fieldNodes
中删除 elements
(在 Tag
解析器中)并使用字段解析器 (params/variableValues)。
如果还有问题check/log info
state/values.
我无法将我的 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 有一个字段 elements,它应该只包含当前用户拥有的元素。
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
}
}
}
结果符合预期。但我想根据上下文附加用户检查并设置解析器中的用户名参数。
但是当我在执行查询之前将以下行添加到标签根解析器时,我的响应是空的。
params['username'] = ctx.user.name;
在这种情况下,生成的密码语句将用户名添加到根标记部分而不是子元素(@cypher 语句)部分。但是我不知道如何在获取数据之前为解析器中的 Tag 字段元素设置用户名参数。
所以我希望有人可能知道如何解决我的问题,或者有比我在这里使用@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);
},
}
};
在 'elements' 字段解析器中添加参数没有任何效果,因为字段解析器是在数据已获取时调用的。
通常根解析器不会 return 整个对象,只会 'own fields' 留下相关字段由字段解析器处理。在这种情况下,看起来 neo4jgraphql
(我猜,我没有使用它)足够聪明,可以完全在根级别处理它。
如果 Tag
中的 params["username"] = ctx.user.name;
不起作用,那么看起来 neo4jgraphql
不关心 params
(恕我直言,它应该 - 问题?)并且有效直接在解析器 info
参数上(已经存在的变量)。
尝试将 username
添加到 variableValues
数组中。 Explanations
在这种情况下不需要字段解析器。
第二个选项:从 fieldNodes
中删除 elements
(在 Tag
解析器中)并使用字段解析器 (params/variableValues)。
如果还有问题check/log info
state/values.