如何在GraphQL Schema中定义对象类型?适配MongoDB待办日期对象
问题:MongoDB中对象类型的due_date字段,在GraphQL Schema里该如何正确定义?
我有如下MongoDB待办事项Schema:
const todoSchema = new Schema( { userId: { type: String, required: true }, title: { type: String, required: true }, due_date: { date: { type: Number }, month: { type: Number }, year: { type: Number }, hours: { type: Number }, minute: { type: Number }, }, status: { type: String, required: true}, }, { timestamps: true } );
我编写了如下GraphQL Schema:
const Todo = new GraphQLObjectType({ name: "Todo", fields: () => ({ _id: { type: GraphQLID }, userId: { type: GraphQLString }, title: { type: GraphQLString }, due_date: { type: GraphQLString }, status: { type: GraphQLString }, }) });
请问due_date的正确类型是什么?在MongoDB中我将其定义为对象,如何在GraphQL Schema中把due_date定义为对象类型?
解决方案
你不能把due_date定义为GraphQLString,因为它在MongoDB里是包含多个数字字段的对象。正确做法是为due_date单独定义一个GraphQL对象类型,再在Todo类型中引用这个新类型。
步骤1:定义DueDate对象类型
创建对应MongoDB中due_date结构的GraphQL对象类型:
const DueDate = new GraphQLObjectType({ name: "DueDate", fields: () => ({ date: { type: GraphQLInt }, month: { type: GraphQLInt }, year: { type: GraphQLInt }, hours: { type: GraphQLInt }, minute: { type: GraphQLInt }, }) });
这里用GraphQLInt是因为MongoDB里的字段类型为Number,对应GraphQL的整数类型。
步骤2:在Todo类型中引用DueDate
修改Todo类型里的due_date字段,替换为自定义的对象类型:
const Todo = new GraphQLObjectType({ name: "Todo", fields: () => ({ _id: { type: GraphQLID }, userId: { type: GraphQLString }, title: { type: GraphQLString }, due_date: { type: DueDate }, // 使用自定义对象类型 status: { type: GraphQLString }, }) });
额外说明:处理输入场景(创建/更新Todo)
如果需要在GraphQL的输入参数中传递due_date对象,还要定义对应的输入类型(InputType)——普通ObjectType无法用于输入参数:
const DueDateInput = new GraphQLInputObjectType({ name: "DueDateInput", fields: () => ({ date: { type: GraphQLInt }, month: { type: GraphQLInt }, year: { type: GraphQLInt }, hours: { type: GraphQLInt }, minute: { type: GraphQLInt }, }) });
之后在创建或更新Todo的Mutation中,就可以用DueDateInput作为due_date参数的类型。
内容的提问来源于stack exchange,提问作者coderNoob
相关产品推荐
相关产品推荐

