首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在解析器中设置字段参数

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

Stack Overflow用户
提问于 2018-09-23 18:15:54
回答 1查看 367关注 0票数 0

我有一个问题,要将graphql端点限制为只提供请求用户可以请求的数据

我在用

代码语言:javascript
复制
apollo-server 2.1.0
express 4.16.3
graphql 0.13.2
graphql-tools 4.0.0
neo4j-graphql-js 0.2.1

类型标记有一个字段元素,它应该只包含当前用户拥有的元素。

代码语言:javascript
复制
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")
}

当我的查询看起来是:

代码语言:javascript
复制
{
Tag{
    name,
    elements(username:"crmue"){
      name
    }
  }
}

结果看上去像是预料中的。但是我想根据附加的用户上下文检查并设置解析器中的username参数。

但是,当我在执行查询之前将以下行添加到标记根解析器时,我的响应是空的。

代码语言:javascript
复制
params['username'] = ctx.user.name;

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

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

谢谢!

更新

我目前的基本解决方案是:

代码语言:javascript
复制
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); 
    },

  }
};

在“元素”字段解析器中添加param没有任何效果,因为字段解析器是在数据已被获取时调用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-25 08:22:31

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

如果params["username"] = ctx.user.name; in Tag不起作用,那么看起来neo4jgraphql不关心params (IMHO应该发行吗?)并直接处理解析器info参数(已经存在的变量)。

尝试将username添加到variableValues数组中。在这种情况下不应该需要解释字段解析器。

第二个选项:将elementsfieldNodes (在Tag解析器中)中删除,并使用字段解析器(params/variableValues)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52468965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档