如何在graphql查询中解析嵌套项目

时间:2020-06-11 21:18:19

标签: react-apollo graphql-js prisma

我正在尝试以下操作:

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

答案 0 :(得分:0)

正如您所说,当您运行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 .:我会稍微更改一下您的架构。我将创建一个引用CartItemquantity: Int的{​​{1}},并将它们包含在您的item: Item