【问题标题】:How to resolve a nested item in a graphql query如何解决 graphql 查询中的嵌套项
【发布时间】: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,我会得到那个项目。

【问题讨论】:

    标签: react-apollo graphql-js prisma


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 1970-01-01
      • 2019-10-14
      • 2021-01-29
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 2018-06-13
      相关资源
      最近更新 更多