0

我目前正在将 neo4j 和 graphql 与 Apollo 服务器一起使用。

我有以下类型:

  type Person {
    id: ID! @id
    externalId: ID
    name: String!
  }

  extend type Person
    @auth(
      rules: [
        { operations: [CREATE, UPDATE], bind: { externalId: "$jwt.sub" } }
      ]
    )

当我尝试进行以下突变时:

mutation Mutation($input: [PersonCreateInput!]!) {
  createPeople(input: [
    {
      "name": "abc"
    }
  ]) {
    people {
      name
    }
  }
}

我从 Neo4j 收到一个 FORBIDDEN 错误。

我调试了一些代码,看起来这就是正在转换的内容:

CALL {\n' +
      'CREATE (this0:Person)\n' +
      'SET this0.id = randomUUID()\n' +
      'SET this0.name = $this0_name\n' +
      'WITH this0\n' +
      'CALL apoc.util.validate(NOT(this0.externalId IS NOT NULL AND this0.externalId = $this0_auth_bind0_externalId), "@neo4j/graphql/FORBIDDEN", [0])\n' +
      'RETURN this0\n' +
      '}\n' +
      'RETURN \n' +
      'this0 { .name } AS this0',

因此,如果我正确理解这一点,如果 externalID 为 NULL 并且 externalID 与我的 jwt 子值不同,那么它将引发异常。

基本上我想要实现的是:

创建人员节点时,将 externalID 值分配给sub我的 JWT 的属性值。

我在这里做错了什么?

4

1 回答 1

2

我认为双重否定导致与谓词有些混淆。this0.externalId如果为空或由于 AND 语句和周围的 NOT this0.externalId不等于,将引发异常。$this0_auth_bind0_externalId

由于您在this0上面创建它,它永远不会有this0.externalId,所以这个谓词将始终为真,并且将始终抛出异常。

我不擅长 GraphQL,但我认为你的变异需要设置externalId.

于 2021-11-16T07:42:09.277 回答