Apollo创建消息时未返回关联对象问题咨询
问题:创建消息Mutation无法返回关联的User和Session对象
我编写了用于创建消息并关联User和Session的Mutation代码,以及对应的GraphQL TypeDef定义,但执行创建操作后,服务器日志输出仅包含基础字段,未返回关联的User和Session对象。
现有代码
Mutation 实现代码
Mutation: { createMessage: async (_, args) => { const x = await prisma.message.create({ data: { message: args.message, user: { connect: { id: Number(args.userId) } }, session: { connect: { id: Number(args.sessionId) } } } }) console.log(x) return x }, },
GraphQL TypeDef 定义
type Message { id: ID, message: String user: User } type Mutation { createMessage( sessionId: ID! userId: ID! message: String! ): Message }
执行结果日志
{ id: 23, message: 'This is a message!', userId: 100, sessionId: 6 }
解决方案
1. 修改Prisma查询,添加include选项
Prisma的create方法默认只会返回模型的基础字段,不会自动加载关联对象。需要在create配置中添加include属性,明确指定要返回的关联关系:
Mutation: { createMessage: async (_, args) => { const x = await prisma.message.create({ data: { message: args.message, user: { connect: { id: Number(args.userId) } }, session: { connect: { id: Number(args.sessionId) } } }, // 新增include配置,指定要返回的关联对象 include: { user: true, session: true } }) console.log(x) return x }, },
2. 更新GraphQL TypeDef(若需要返回Session)
原TypeDef中的Message类型未定义session字段,如果需要在返回结果中包含Session对象,需要补充该字段:
type Message { id: ID, message: String user: User session: Session # 补充session字段,需确保已定义Session类型 } type Mutation { createMessage( sessionId: ID! userId: ID! message: String! ): Message }
3. 确保GraphQL查询请求包含关联字段
即使后端返回了关联对象,前端发起GraphQL请求时也需要明确指定要获取的关联字段,否则只会返回基础字段。示例查询:
mutation CreateMessage($sessionId: ID!, $userId: ID!, $message: String!) { createMessage(sessionId: $sessionId, userId: $userId, message: $message) { id message user { # 指定要获取的user关联字段 id name # 其他需要的User字段 } session { # 指定要获取的session关联字段 id # 其他需要的Session字段 } } }
内容的提问来源于stack exchange,提问作者Peter Boomsma
相关产品推荐
相关产品推荐

