自定义解决函数在Grandstack中返回未定义

问题描述

我在A文件中定义了Bschema.graphql的类型定义。这些解析器是自动生成的,并且可以很好地工作(在其他地方)。

要创建一种评分机制,以将具有标签B的节点相对于具有标签A的节点进行排名,我正在编写一个Customresolver查询,该查询执行密码查询并返回bs的集合和定义的计算分数scoredBs类型。

schema.graphql文件如下所示。

type Query {
  Customresolver(idA: ID!,idsB: [ID!]!): [scoredBs]
}
type A {
  id: ID! @id
  # and some more stuff of course
}
type B {
  id: ID! @id
  # more fields that use the @relation or @cypher decorator
}
type scoredBs {
  bs: [B]
  score: Float
}

这是定义自定义解析器的地方:

const resolvers = {
  Query: {
    Customresolver: async (
      parent,{ idA,idsB },context,info
    ) => {
      const cypher = `
      MATCH (a:A {id: $idA})
      MATCH (a)<--(b:B) WHERE b.id IN $idsB

      WITH
        b

      RETURN disTINCT collect(b) AS bs,rand() AS score
      ORDER BY score DESC
      `
      const session = context.driver.session()
      const results = await session
        .run(cypher,idsB })
        .then((result) => {
          return result.records.map((record) => {
            return {
              bs: record.get('bs'),score: record.get('score')?.low || null,}
          })
        })
        .catch(console.log)
        .then((results) => {
          session.close()
          return results
        })
      return results
    },},}

当我在apollo服务器graphql操场上运行查询时,我收到一个错误

“ message”:“未定义的“ B.id”解析函数返回”,

query {
  Customresolver(
    idA:"2560886f-654b-4047-8d7a-386cd7d9f670",idsB: ["01ec8367-a8ae-4600-9f88-ec141b2cae2c","032f9a88-98c3-4968-8388-659ae26d63b3"]
  ) {
    bs {
      id
    }
    score
  }
}

解决方法

我通过重写部分代码来解决了这个问题:

  const results = await session
    .run(cypher,{ idA,idsB })
    .then((result) => {
      return result.records.map((record) => {
        // diff start
        const obj = record.toObject()
        const bs = obj.bs.map((b) => b.properties)
        return {
          bs,// diff end
          score: record.get('score')?.low || null,}
      })
    })
    .catch(console.log)
    .then((results) => {
      session.close()
      console.log(results)
      return results
    })
  return results