【问题标题】:How to set a field parameter inside resolver如何在解析器中设置字段参数
【发布时间】:2019-02-27 08:28:49
【问题描述】:

我无法将我的 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 语句将用户名 agument 放置到根标记部分而不是子元素(@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解析器中使用ctx.user.name
  • 我试过了,但是当已经获取数据时会调用字段解析器。之后我可以使用element 解析器过滤获取的数据。

标签: neo4j graphql apollo-server


【解决方案1】:

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

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

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

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

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

【讨论】:

  • neo4j-graphql-js 尝试在根标签解析器中的数据库的一次往返中获取所有内容。字段elements@cypher 指令用于构建这个单一的密码语句。我通过您的建议解决了我的问题,即修改 relover 信息中的参数值。这不是很方便,但确实有效。
  • 在 github 上为 neo4j-graphql-js 创建了一个问题,请参阅 issue link #112
猜你喜欢
  • 2019-09-21
  • 2016-02-22
  • 2018-06-16
  • 2017-01-11
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
相关资源
最近更新 更多