当前位置: 首页 > 知识库问答 >
问题:

来自GraphQL突变的响应未按预期工作

娄学文
2023-03-14

我正在通过解析器运行GraphQl变异。这是与Neo4j数据库的对比。该查询运行良好,但是我无法以在结果中显示的方式组织结果。我已经尝试了几种不同的结果和记录映射组合,但是我无法在输出中显示返回结果集的属性。

具体来说,在下面的示例中,您将看到响应中的name字段(通过GraphiQL)在我希望将其设置为返回值时为空。

解析器:

 AddIdiomHasChildIdiom(object, params, ctx, resolveInfo) {
      //************************************************************************************************************************************
      //** Author:        MOS
      //** Date:          22/07/2019
      //** Description:   Add a child Idiom         
      //************************************************************************************************************************************

      //Build the cypher query across multiple lines so that we can adjust the query depending on which parameters are passed
      let query = new StringBuilder();

      query.appendLine("MATCH (p:entity:Idiom {id:'" + params.from.id + "'}), (c:entity:Idiom {id:'" + params.to.id + "'})")
      query.appendLine("MERGE (p)-[r:HAS_CHILD_IDIOM]->(c)")
      query.appendLine("RETURN p,c")

      console.log(query)
      //Execute the query and send the results back to the user
      return ctx.driver.session().run(query.toString(), {props:params})
        .then(result => {
          return {
            from: result.records.map(record => { return record.get("p").properties}),
            to: result.records.map(record => { return record.get("c").properties})
          }  
          }) 
        .catch(error => {
          //ToDo: Error handling code need to go here
        })
    }

GraphQL查询

mutation{
  AddIdiomHasChildIdiom(from:{id:"d94676b0-ac6c-11e9-a7a1-edf120d553ac"},to:{id:"e730a720-ac74-11e9-a45f-df629a6df5e1"})
  {
    from{
      name
    }
    to{
      name
    }
  }
}

输出:

{
  "data": {
    "AddIdiomHasChildIdiom": {
      "from": {
        "name": null
      },
      "to": {
        "name": null
      }
    }
  }
}

相关架构部分

type Mutation{
  AddIdiomHasChildIdiom(
    from: _IdiomInput!
    to: _IdiomInput!
  ): _AddIdiomHasChildIdiomPayload
}

type _AddIdiomHasChildIdiomPayload {
  from: Idiom
  to: Idiom
}
input _IdiomInput {
  id: ID!
}

type _AddIdiomHasChildIdiomPayload {
  from: Idiom
  to: Idiom
}
type Idiom {
    id: ID
    name: String 
    type: IdiomType
    description: String
    lifecycle: IdiomLifecycle
    quality: Float
    numStates: Int
    numChildIdioms: Int
    hasChildIdiom: [Idiom]
    first: Int
    offset: Int
    orderBy: [_IdiomOrdering]
}

共有1个答案

范嘉
2023-03-14

您的代码中的问题是您的图形ql模式和解析器的实现之间的类型不匹配。

您的突变查询应该返回以下内容:

type _AddIdiomHasChildIdiomPayload {
  from: Idiom
  to: Idiom
}

您的解析器返回以下内容:

return {
  from: result.records.map(record => { return record.get("p").properties}),
  to: result.records.map(record => { return record.get("c").properties})
}

这里你使用的是map函数,它的结果是一个数组。所以你返回的是这样的东西:

{
  from : [ { id:'', name:'', ... } ]
  to : [ { id:'', name:'', ... } ]
}

和<代码>[ { id:'',名称:' ',...} ]不验证模式的< code >习语类型,它是一个数组:< code >习语[]。

因此,您需要更改解析器以仅返回一个元素 from

此外,你的实现很奇怪:由于使用了两个映射并且你没有关闭会话,你正在对 Neo4j 的结果执行两个循环。

你应该尝试这样的事情:

const session = ctx.driver.session();
return session.run(query.toString(), {props:params})
  .then(result => {
    return result.records.map(record => {
      return {
        from:record.get("p").properties
        to:record.get("c").properties
      }
    })[0]
  })
  .catch(error => {
      //ToDo: Error handling code need to go here
  })
  .finally(() => {
    session.close();
  })

而且

 类似资料:
  • 我有一个自定义案例类异常: 在我的 dao 中,我有一个从数据库中提取对象的方法,该方法返回 future,如果此将来失败,我将抛出我的 RecordNotFoundException 异常: 在另一个方法中,我调用getPerson方法,所以我将恢复添加到另一个方法中,当未来使用RecordNotFoundException失败时,我想返回一些东西: 因此,基本上,我希望当getPerson失败

  • 我正在使用spring Roo并希望访问Controller类中的一个bean,该类在ApplicationContext.xml中具有以下配置: 配置类本身是: 在我的Controller中,我认为一个简单的Autowired注释应该可以完成这项工作 在启动过程中,spring在setSkipWeeks方法中打印消息。不幸的是,每当我在控制器中调用config.getSkipWeeks()时,它

  • 当我运行以下程序时,它只打印 然而,从Java 8的equalsIgnoreCase文档中我们发现: 如果以下至少一项为真,则两个字符c1和c2被视为相同的忽略情况: •对每个字符应用java.lang.character.ToUpperCase(char)方法会产生相同的结果 所以我的问题是为什么这个程序不打印 在这两种操作中,都使用了大写字符。

  • 我试图使用来传输我根据前面的问题设置的自定义标头。 我在文件中读到... 我的属性包括:

  • 我正在和selenium一起工作,刮一些数据。 有一个按钮在页面上,我正在点击说“Custom_Cols”。这个按钮为我打开了一个窗口,我可以在那里选择我的列。 我的问题是为什么新窗口上的元素不可见,即使我正在等待元素的可见。补充一下,我已经尝试增加延迟时间,但我还是会偶尔出现这个错误。 我的密码在这里