【问题标题】:GraphiQL return 'null' on query [duplicate]GraphiQL 在查询中返回“null”[重复]
【发布时间】:2017-09-10 02:41:35
【问题描述】:

我实际上是在使用 Neo4j 数据库并使用来自 neo4j_movie_recommendations 代码的示例来试验 GraphQL 和 GraphiQL。我有一个非常奇怪的问题,似乎与 javascript 或 GraphQL 相关。我做了一个简单的查询,而我可以看到解析器可以返回数据(使用 console.log)GraphQL 返回一个“空”值。以下是代码段:

const resolveFunctions = {
    Query: {
        allVoters(_, params) {
            let session = driver.session();
            let query = "MATCH (voter:Voter) RETURN voter;"
            return session.run(query, params)
                .then(result => {
                    return result.records.map(record => {
                        console.log("Voter: " + JSON.stringify(record))
                        return record.get("voter").properties
                    })
                })
        },

    },
    Voter: {
        memberOf(voter) {
            let session = driver.session(),
                params = { voterid: voter.voterid },
                query = `
                        MATCH (v:Voter)-[:MEMBER_OF]->(g:Group)
                        WHERE v.voterid = $voterid
                        RETURN g.name AS groupname;
                        `
            return session
                .run(query, params)
                .then(result => {
                    return result.records.map(record => {
                        console.log("Group Name " + record.get("groupname")) 
                        return record.get("groupname")
                    })
                })
        },

console.log 显示正确的值,但 GraphiQL 显示名称、email..正确,但 memberof 字段显示为“null”。谁能看到我在这里做错了什么?

这是架构....

export default `
type Voter {
  voterid     : String!
  email       : String!
  name        : String!
  nickname    : [String]
  address     : String
  altAddress  : String
  dob         : String
  profession  : String
  telephone   : String
  gender      : String
  skills      : [String]
  votesIn     : PD
  livesIn     : PD 
  memberOf    : [Group]
}
type Group {
  name        : String
  location    : String
  created     : String
  partof      : Division
}
type PD {
  number      : String
  location    : String
  created     : String
  description : String
  partof      : Division 
}
type Division {
  name        : String
  created     : String
  belongsto   : Constituency
 }
 type Constituency {
  name        : String
  created     : String
  reportsto   : Region
 }
 type Region {
  name        : String
  created     : String
  reportsto   : Exec
 }
 type Exec {
  name        : String
  created     : String
 }

type Query {
  allVoters: [Voter]!
  getVoter(voterid: String!): Voter
  }

  schema {
    query: Query
  }
`;

编辑...添加解析器 getvoter 的解析器代码:

  getVoter(_, params) {
            let session = driver.session();
            let query = "MATCH (voter:Voter {voterid: $voterid}) RETURN voter;"
            return session.run(query, params)
                .then(result => {
                    return result.records.map(record => {
                        return record.get("voter").properties
                    })
                })
        },

【问题讨论】:

    标签: javascript neo4j graphql graphql-js graphiql


    【解决方案1】:

    无论您的解析器返回什么,都必须是您的架构定义的正确类型。如果您返回错误的类型(数字而不是字符串),GraphQL 可能会尝试将其强制转换为正确的类型,但在大多数情况下它只会返回 null。

    您的memberOf 字段应该是Group 对象的数组。但是,在您的解析器中,看起来您返回的是一个字符串数组:

    return result.records.map(record => {
      return record.get("groupname")
    })
    

    您需要使用toObject 方法或以其他方式将记录转换为具有与您的架构中为Group 指定的字段匹配的字段的对象。

    【讨论】:

    • ...是的,Daniel Group 实际上是一个对象数组,但我只需要重新调整 obj.name。我试图只返回名称,但显然我必须返回对象,graphql 发送 graphiql 请求的内容......感谢您的提醒。
    • 我有一个关于 Graphql 返回“null”的问题的后续问题。我注意到,除非我将返回类型设置为对象数组,否则我会得到“null”。如果类型可以是数组,但有些查询的结果不能是数组,这可能不是问题,例如getVoter by voterid(其中 voterid 是唯一的)。如果我不使用对象数组作为查询中的返回类型,我将得到一个“空”值。即 getVoter(voterid: String!): Voter 给出 null 而 getVoter(voterid: String!): [Voter] 有效...你能解释一下吗?
    • 如果不查看代码,我无法确定,但听起来您的 getVoter 解析器正在返回一个数组。同样,解析器返回的类型和模式中为该字段指定的类型需要匹配。您不能将 User 作为架构中的返回类型并在解析器中返回对象数组;并且您不能将 [User] 作为架构中的返回类型并在解析器中返回一个对象(而不是对象数组)。
    • @Daniel....我明白了......我不明白......返回和数组或对象的区别是什么。似乎 graphql 认为两者是一样的。我期望结果中只有一个对象,这就是我在这里似乎拥有的:
    • ...或使用类似lodash's first() 的方法
    猜你喜欢
    • 2018-05-19
    • 2019-03-08
    • 2022-01-04
    • 1970-01-01
    • 2019-11-02
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    相关资源
    最近更新 更多