为啥 GraphQL 输入类型会破坏应用程序
Posted
技术标签:
【中文标题】为啥 GraphQL 输入类型会破坏应用程序【英文标题】:Why is the GraphQL input type breaking the app为什么 GraphQL 输入类型会破坏应用程序 【发布时间】:2021-07-28 09:21:23 【问题描述】:我遇到了问题。我试图在 Apollo GraphQL API 上测试一个突变。当我将单个字段用于突变类型时,它起作用了,但是当我用我创建的输入类型替换字段时,我得到一个错误。它在 NextJS 项目中,在 api 文件夹中,所以我使用的是apollo-server-micro
。
错误信息
工作代码
const gql = require("apollo-server-micro");
export const typeDefs = gql`
type Appointment
id: ID!
firstName: String
lastName: String
email: String
phoneNumber: String
type Query
appointments: [Appointment]
appointment(id: Int): Appointment
type Mutation
bookAppointment(
firstName: String!
lastName: String
email: String
phoneNumber: String
): Appointment
input AppointmentInput
firstName: String!
lastName: String
email: String
phoneNumber: String
`;
问题代码
const gql = require("apollo-server-micro");
export const typeDefs = gql`
type Appointment
id: ID!
firstName: String
lastName: String
email: String
phoneNumber: String
type Query
appointments: [Appointment]
appointment(id: Int): Appointment
type Mutation
bookAppointment(appointment: AppointmentInput): Appointment
input AppointmentInput
firstName: String!
lastName: String
email: String
phoneNumber: String
`;
解析器
export const resolvers =
Query:
appointments: async (parent, args, prisma ) =>
return prisma.appointment.findMany();
,
appointment: async (parent, args, context) =>
return context.prisma.appointment.findUnique( where: id: args.id );
,
,
Mutation:
bookAppointment: async (parent, args, context) =>
const id = +Math.floor(Math.random() * 5001) + 1000;
const booking = context.prisma.appointment.create(
data:
id: id,
firstName: args.firstName,
lastName: args.lastName,
email: args.email,
phoneNumber: args.phoneNumber,
,
);
return booking;
,
,
;
【问题讨论】:
突变解析器代码未更新 - 错误/缺少的参数传递到 prisma 确切地说,当我运行将字段传递给输入类型 AppointmentInput 并使用输入的突变时,它不起作用。当我直接在突变中使用这些字段时,它可以工作并接受参数。今天早上在另一个项目中运行,使用常规的 react 和 Apollo 与 Prisma,它按预期工作。 你的解析器是什么样的? 我在上面添加了解析器,很抱歉第一次没有包含它。 【参考方案1】:您可以/应该在更改之前拥有/使用分解的变量:
const firstName, lastName, email, phoneNumber = args;
并简单/直接使用firstName
, lastName
...
改变将是微不足道的:
const firstName, lastName, email, phoneNumber = args.appointment;
或
const appointment: firstName, lastName, email, phoneNumber = args;
...但您也可以将其全部缩短:
const booking = context.prisma.appointment.create(
data:
id, ...args.appointment
,
【讨论】:
以上是关于为啥 GraphQL 输入类型会破坏应用程序的主要内容,如果未能解决你的问题,请参考以下文章
当我从 Angular 传递 graphql 查询时,为啥 GraphQL 控制器中的参数查询为空?
为啥 withRouter 与 connect() 一起使用会破坏我的反应应用程序?
为啥 update_attributes 会破坏我的 Rails 应用程序?