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

时间:2018-09-23 18:15:55

标签: neo4j graphql apollo-server

我在将我的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

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

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
    }
  }
}

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

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

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

在这种情况下,生成的cypher语句将用户名集合放在根Tag区域而不是子Element(@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); 
    },

  }
};

在“元素”字段解析器中添加参数无效,因为已在获取数据时调用了字段解析器。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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