如何解决 graphql 查询中的嵌套项

Posted

技术标签:

【中文标题】如何解决 graphql 查询中的嵌套项【英文标题】:How to resolve a nested item in a graphql query 【发布时间】:2020-10-01 15:32:29 【问题描述】:

我正在尝试以下操作:

const CURRENT_USER_QUERY = gql`
  query 
    me 
      id
      email
      name
      permissions
      cart 
        id
        quantity
        item 
          id
          title
        
      
    
  
`

但我无法正确解析项目字段。

这是购物车解析器(它可以正确解析,但仅适用于具有标量返回值的字段:

async function cart(parent, args, ctx, info) 

  const cart = await ctx.prisma.user( id: parent.id ).cart()

  return cart


module.exports = 
  cart,

它只解析标量值idquantityitem 字段是 CartItem 类型:

type CartItem 
  id: ID!
  quantity: Int!
  item: Item!
  user: User!

如何编写解析器以免出现此错误,例如:

Message: Cannot return null for non-nullable field CartItem.item., Location: [object Object], Path: me,cart,2,item

prisma 数据库与项目和用户都有正确的关系——我可以在 prisma 数据库中看到它们。我只是无法正确解决该项目。如果我返回一个有效的项目 ID,我会得到那个项目。

【问题讨论】:

【参考方案1】:

正如你所说,当你运行 await ctx.prisma.user( id: parent.id ).cart() 时,prisma 只会得到你的标量值,而这些是唯一从你的 cart 解析器中转发出去的值

您需要为该特定字段创建解析器。像这样的:

const Cart = 
  item: (parent, args, ctx, info) => 
    return ctx.prisma.cart( id: parent.id ).item()  
  ,


export  Cart as default 

然后,您需要在为服务器定义架构时包含解析器文件:

import Cart from './resolvers/Cart';

const schema = 
  typeDefs: 'api/schema.graphql',
  resolvers: 
    Query,
    Mutation,
    Cart,    
  ,
  context: async (request) => 
    // whatever you had here before
  ,
;
const server = new GraphQLServer(schema);

此方法还允许您公开类型的计算字段(例如:计算所有购物车项目平均值的字段)。

P.S.:我会稍微更改一下您的架构。我会创建一个 CartItem 引用 quantity: Intitem: Item,并将它们包含在您的 Cart

【讨论】:

以上是关于如何解决 graphql 查询中的嵌套项的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL/Graph.cool 查询过滤嵌套关系

嵌套查询 GraphQL:语法错误 - iOS

如何在 Graphql 中连接嵌套查询?

如何在 reactJS 中映射嵌套的 graphQL 查询

如何使用 gatsby-source-prismic 在 graphql 中执行嵌套查询

如何使用 GraphQL Yoga 进行多个嵌套查询(GET 请求)?