如何解决 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,
它只解析标量值id
和quantity
。 item
字段是 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: Int
和 item: Item
,并将它们包含在您的 Cart
中
【讨论】:
以上是关于如何解决 graphql 查询中的嵌套项的主要内容,如果未能解决你的问题,请参考以下文章