来自GraphQL突变的响应未按预期运行

时间:2019-07-23 10:44:41

标签: neo4j graphql neo4j-graphql-js

我正在通过解析器运行GraphQ1突变。它针对Neo4j数据库。查询工作正常,但是我无法以将结果显示回结果的方式来构造结果。我尝试了几种不同的结果和记录映射组合,但是无法获得返回结果集的属性以显示在输出中。

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

解析器:

 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 个答案:

答案 0 :(得分:0)

您的代码中的问题是,您的graphql模式与解析器的实现之间具有不匹配类型。

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

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:'', name:'', ... } ]不会验证架构的Idiom类型,它是一个数组:Idiom[]

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

此外,您的实现很奇怪:由于使用了两个映射,您正在针对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();
  })

而且